<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      循環鏈表(單鏈表)

        

        當循環鏈表中只有一個節點時,節點自己指向自己。實現循環鏈表,需要一個外部變量指向鏈表的尾節點。

      class CircleLinkedList<T> {
          private class Node {
              T data;
              Node next;
      
              Node(T data) {
                  this.data = data;
              }
          }
      
          private Node last;
      }

        向鏈表中插入元素有三種情況,插入到鏈表的頭部,插入到鏈表的尾部,插入到鏈表兩個節點之間。當然,無論是哪種情況,都要檢查鏈表是否為空。如果鏈表為空,讓last指向新創建的節點,并自己指向自己。

      private void addToEmpty(T data) {
          var newNode = new Node(data);
          last = newNode;
          newNode.next =last; // 鏈表自己指向自己
      }

        如果鏈表不為空,比如有如下鏈表

         1,向鏈表頭部插入元素,比如向鏈表的頭部插入6,那就先創建一個新節點newNode, 然后讓newNode.next 指向last.next,因為last.next就是頭節點,最后讓last.next指向最新的頭節點newNode.

      public void addFront(T data) {
          if (last == null) {
              addToEmpty(data);
          } else {
              var newNode = new Node(data);
              newNode.next = last.next;
              last.next = newNode;
          }
      }

        2,向鏈表尾部插入節點,讓last的next指向新的節點,last再指向新節點,當然,不要忘記它是循環鏈表,新節點的next還要指向頭節點

      public void addLast(T data) {
          if (last == null) {
              addToEmpty(data);
          } else {
              var newNode = new Node(data);
              newEntry.next = last.next; // 新節點的next指向頭節點
              last.next = newEntry;
              last = newEntry;
          }
      }

         3,向兩個節點之間添加元素,就是向某一個元素后面添加元素,首先遍歷鏈表,找到這個元素。如果這個元素正好是尾節點,那么還要移動last的位置

      // 向某個item后面 添加值,
      public void addAfter(T item, T data) {
          if(last == null) {
              throw new RuntimeException("鏈表為空");
          } else {
              var found = false;
              var temp = last.next; // 頭節點
      
              do {
                  if(temp.data.equals(item)){
                      found = true;
                  } else {
                      temp = temp.next;
                  }
              } while(temp != last.next && !found);
      
              if(found) {
                  // temp就是將要向它向面添加元素的節點
                  var newNode = new Node(data);
                  // 先獲取到舊的temp.next
                  var oldNext = temp.next;
                  temp.next = newNode;
                  newNode.next = oldNext;
      
                  //如果正好添加尾節點后面,還要移動last的指向
                  if (temp == last) {
                      last = newNode;
                  }
              } else {
                  throw new RuntimeException("沒有找到元素");
              }
          }
      }

        刪除節點:如果鏈表為空,肯定是要報錯的。如果鏈表中只有一個節點,那么如果刪除的節點正好是這個節點,那么就刪除,last=null,如果不是,那也只能報錯了。如果有多個節點,但正好刪除的是最后一個節點,那就要循環鏈表,找到最后一個節點的前一個節點,然后修改last指向,

         如果是刪除中間一個元素,遍歷找到前一個節點,

       

      public void deleteNode(T item) {
          // 鏈表為空,肯定不能刪除
          if(last == null) {
              throw new RuntimeException("鏈表為空");
          } else if(last.next == last) { // 鏈表只有一個節點
              if (last.data.equals(item)){
                  last = null;
              } else {
                  throw new RuntimeException("沒有找到元素");
              }
              // 鏈表有多個節點
          } else if (last.data.equals(item)) { // 刪除的節點,正好是最后一個節點
              // 找到最后一個節點的前一個節點
              var temp = last;
              while(temp.next != last) {
                  temp = temp.next;
              }
      
              temp.next = last.next;
              last = temp;
          } else {
              var temp = last;
              // 找到前面一個節點
              while(!temp.next.data.equals(item) && temp.next != last) {
                  temp = temp.next;
              }
      
              if(temp.next.data.equals(item)) {
                  temp.next= temp.next.next;
              } else {
                  throw new RuntimeException("沒有找到元素");
              }
          }
      }

        遍歷

      public void traverse() {
          if (last == null) {
              throw new RuntimeExceiption('空鏈表');
          }
      
          var p = last.next;
      
          do {
              System.out.print(p.data + " ");
              p = p.next;
          }
          while (p != last.next);
      }

        測試

      public static void main(String[] args) {
          var circleList = new CircleSingleLinkedList<Integer>();
      
          circleList.addFront(6);
          circleList.addEnd(8);
          circleList.addFront(2);
      
          circleList.addAfter(2, 10);
      
          circleList.traverse();
      
          System.out.println();
      
          circleList.deleteNode(8);
          circleList.traverse();
      }

         

       

      posted @ 2022-04-22 20:15  SamWeb  閱讀(1466)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 久久久久无码国产精品不卡| 天堂网av成人在线观看| 宾馆人妻4P互换视频| 国产精品黄色片| 97一期涩涩97片久久久久久久| 日本亚洲一区二区精品久久| 在线观看无码不卡av| 久久午夜无码免费| 国产专区一va亚洲v天堂| 在线日韩日本国产亚洲| 国产精品中文字幕免费| 蜜桃一区二区三区免费看| 国产粉嫩美女一区二区三| 日韩V欧美V中文在线| 日韩精品理论片一区二区| 丰满少妇在线观看网站| 亚洲第一无码专区天堂| 国产老熟女国语免费视频| 日本一本正道综合久久dvd | 日本熟妇色xxxxx| 一区二区三区成人| 成年黄页网站大全免费无码| 国产精品三级中文字幕| 成人精品视频一区二区三区| 国产精品一码二码三码| 人妻熟女一区二区aⅴ向井蓝| 欧美亚洲熟妇一区二区三区| 日本欧美大码a在线观看| 日韩欧美人妻一区二区三区| 老熟女多次高潮露脸视频| 无码人妻aⅴ一区二区三区蜜桃| 久久国产精品成人免费| 国产无遮挡吃胸膜奶免费看| 99精品热在线在线观看视| 亚洲真人无码永久在线| 亚洲国产成人精品女久久| 国产亚洲欧美在线观看三区| 亚洲精品免费一二三区| 18禁免费无码无遮挡网站| 五月天国产成人av免费观看| 无遮高潮国产免费观看|