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

链表

  • 在大多数情况下,我们将使用头结点(第一个结点)来表示整个列表。
  • 如果我们想要获得第 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更多内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值