链表学习--单链表-增删查实现

简介: 单链表的学习,增删查。java 实现

链表

  • 在大多数情况下,我们将使用头结点(第一个结点)来表示整个列表。
  • 如果我们想要获得第 i 个元素,我们必须从头结点逐个遍历。 我们按索引来访问元素平均要花费 O(N) 时间,其中 N 是链表的长度。

实现如下功能 :

  • get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
  • addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
  • addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
  • addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
  • deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。

代码如下:

一、定义单链表的节点

     package com.leetCode.study.Demo_2019_8_8_Linked;
          /**
           * 单链表的定义
           * @author liudongting
           * @date 2019/8/8 10:45
           */
          public class SinglyListNode {
          
          
              //val 是当前节点的值
          
              int val;
          
              //next 是指向下一个节点的指针/引用
          
              SinglyListNode next;
              //带参构造函数
          
              SinglyListNode(int x) { val = x; }
          
          }
 

二、链表

 package com.leetCode.study.Demo_2019_8_8_Linked;
 
 /**
  * @author liudongting
  * @date 2019/8/8 10:56
  */
 public class List {
 
     static  SinglyListNode head;
 
     /**
      *
      * addAtTail(val)
      * 将值为 val 的节点追加到链表的最后一个元素。
      */
     public void addAtTail(int val){
         SinglyListNode singlyListNode = new SinglyListNode(val);
         //如果头节点为空,添加到头节点
         if(head == null){
             head = singlyListNode;
             return;
         }
         //从头节点开始
         SinglyListNode temp = head;
         //从头节点开始判断,是否有下一个节点,找到最后一个节点
         while (temp.next != null){
             temp = temp.next;
         }
         //最后一个节点的指针指向新加入的节点
         temp.next = singlyListNode;
     }
 
     /**
      * 获取链表中第 index 个节点的值。如果索引无效,则返回-1。
      * @param index
      */
     public int get(int index){
 
       int length =0 ;
       //从头节点开始
       SinglyListNode temp = head;
         //如果结点不为空,判断该节点的索引是否和要求的索引一致。相同则返回,不同继续;
         while (temp != null) {
             if(length==index){
                 return temp.val;
             }
             length++;
             temp = temp.next;
         }
       return -1;
     }
 
     /**
      * 在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
      * @param val
      */
 
     public void  addAtHead(int val){
         SinglyListNode singlyListNode = new SinglyListNode(val);
         //如果头节点为空,添加到头节点
         if(head == null){
             head = singlyListNode;
             return;
         }
         //创建临时节点,保存头节点的值
         SinglyListNode temp = head;
         //新节点的值,给头结点
         head=singlyListNode;
         //新的头结点的下一个元素指向原来的头结点、
          head.next = temp;
     }
 
     /**
      *  在链表中的第 index 个节点之前添加值为 val  的节点。
      *  如果 index 等于链表的长度,则该节点将附加到链表的末尾。
      *  如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
      *
      *
      */
     public void addAtIndex(int index,int val){
         if(index<0){
             addAtHead(val);
             return;
         }
         if(linkListLength()==index){
             addAtTail(val);
             return;
         }
         if(index>linkListLength()){
             return;
         }
         SinglyListNode singlyListNode = new SinglyListNode(val);
         int length =0 ;
         //从头节点开始
         SinglyListNode temp = head;
         //如果结点不为空,判断该节点的索引是否和要求的索引一致。相同则返回,不同继续;
         while (temp != null) {
             if((length+1)==index){
                 //index 前一个节点的指针指向的节点,即index处的节点
                 SinglyListNode preNode = temp.next;
                 //index 前一个节点的指针 指向 新的节点
                temp.next = singlyListNode;
                //新节点的下一个指针指向 index节点
                singlyListNode.next= preNode;
                return;
             }
             length++;
             temp = temp.next;
         }
     }
 
     /**
      * 获取链表的长度
      * @return
      */
     public int  linkListLength() {
 
         int length = 0;
 
         //临时节点,从首节点开始
         SinglyListNode temp = head;
 
         // 找到尾节点
         while (temp != null) {
             length++;
             temp = temp.next;
         }
 
         return length;
     }
 
     /**
      * 如果索引 index 有效,则删除链表中的第 index 个节点。
      * @param index
      */
     public void deleteAtIndex(int index){
 
         int length = 0;
 
         //临时节点,从首节点开始
         SinglyListNode temp = head;
         if(index==length){
            head=head.next;
         }
         // 找到尾节点
         while (temp != null) {
             if((index-1)==length){
                 SinglyListNode indexNode =temp.next;
                 SinglyListNode nextNode = indexNode.next;
                 temp.next = nextNode;
                 return;
             }
             length++;
             temp = temp.next;
         }
 
     }
     public static void main(String[] args) {
         List list = new List();
         // 添加元素
         list.addAtTail(2);
         //在头结点添加元素
         list.addAtHead(3);
         //在指定位置添加元素
         list.addAtIndex(1,4);
         //根据索引删除元素
         list.deleteAtIndex(2);
         //获取链表的长度
         list.linkListLength();
         System.out.println("222");
         System.out.println(" 获取链表的长度 list.linkListLength() : " +list.linkListLength());
         System.out.println(" 获取链表的某个元素 list.get(1) : " + list.get(2));
     }
 }

[github 获取更多源码] https://github.com/florarose/biji
欢迎关注公众号,查看更多内容 :
XG54_9_WXMH_5X_HB_H_7V

相关文章
|
2月前
|
存储
【单链表】数据结构单链表的实现
【单链表】数据结构单链表的实现
|
3月前
|
存储 缓存 算法
链表全景:探索单链表、双向链表与循环链表【实战演练】
链表全景:探索单链表、双向链表与循环链表【实战演练】
34 3
|
4月前
leetcode:203. 移除链表元素(有哨兵位的单链表和无哨兵位的单链表)
leetcode:203. 移除链表元素(有哨兵位的单链表和无哨兵位的单链表)
20 0
|
5月前
|
存储
数据结构:图文详解单链表的各种操作(头插法,尾插法,任意位置插入,删除节点,查询节点,求链表的长度,清空链表)
数据结构:图文详解单链表的各种操作(头插法,尾插法,任意位置插入,删除节点,查询节点,求链表的长度,清空链表)
270 0
|
1月前
|
缓存 算法 搜索推荐
【数据结构】链表(单链表与双链表实现+原理+源码)
【数据结构】链表(单链表与双链表实现+原理+源码)
|
2月前
|
算法 Java 索引
【数据结构与算法】4、双向链表(学习 jdk 的 LinkedList 部分源码)
【数据结构与算法】4、双向链表(学习 jdk 的 LinkedList 部分源码)
35 0
|
4月前
|
JavaScript 算法 前端开发
TypeScript算法专题 - blog2 - 单链表节点的索引、结点删除与链表反转
TypeScript算法专题 - blog2 - 单链表节点的索引、结点删除与链表反转
31 0
数据结构实验之链表七:单链表中重复元素的删除
数据结构实验之链表七:单链表中重复元素的删除
数据结构实验之链表五:单链表的拆分
数据结构实验之链表五:单链表的拆分
|
5月前
|
存储
链表基础知识(一、单链表、头插、尾插、头删、尾删、查找、删除、插入)
链表基础知识(一、单链表、头插、尾插、头删、尾删、查找、删除、插入)