鏈表學習--單鏈表-增刪查實現

鏈表

  • 在大多數情況下,我們將使用頭結點(第一個結點)來表示整個列表。
  • 如果我們想要獲得第 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更多內容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章