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

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

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

      劍指Offer面試題:15.反轉鏈表

      一、題目:反轉鏈表

      題目:定義一個函數,輸入一個鏈表的頭結點,反轉該鏈表并輸出反轉后鏈表的頭結點。

        鏈表結點定義如下,這里使用的是C#描述:

          public class Node
          {
              public int Data { get; set; }
              // 指向后一個節點
              public Node Next { get; set; }
      
              public Node(int data)
              {
                  this.Data = data;
              }
      
              public Node(int data, Node next)
              {
                  this.Data = data;
                  this.Next = next;
              }
          }

      二、解題思路

      2.1 借助外部空間的解法一

        由于題目并沒有要求必須原地反轉,因此可以借助外部空間實現。這里可以將單鏈表儲存為數組,然后按照數組的索引逆序進行反轉。但是,此方式比較浪費空間,而且需要兩次遍歷,效率不占優勢。

        依據上面的思路,我們可以寫出以下代碼:

          public static Node ReverseList1(Node head)
          {
              if(head == null)
              {
                  return null;
              }
      
              List<Node> nodeList = new List<Node>();
              while (head != null)
              {
                  nodeList.Add(head);
                  head = head.Next;
              }
      
              int startIndex = nodeList.Count - 1;
              for (int i = startIndex; i >= 0; i--)
              {
                  Node node = nodeList[i];
                  if (i == 0)
                  {
                      node.Next = null;
                  }
                  else
                  {
                      node.Next = nodeList[i - 1];
                  }
              }
              // 現在頭結點是原來的尾節點
              head = nodeList[startIndex];
              return head;
          }

      2.2 使用三個指針的高效解法二

        定義3個指針,分別指向當前遍歷到的結點、它的前一個結點及后一個結點。在遍歷過程中,首先記錄當前節點的后一個節點,然后將當前節點的后一個節點指向前一個節點,其次前一個節點再指向當前節點,最后再將當前節點指向最初記錄的后一個節點,如此反復,直到當前節點的后一個節點為NULL時,則代表當前節點時反轉后的頭結點了。

        整個過程只需遍歷鏈表一次,效率提高不少,且需要的外部空間也較第一種方法要少很多,實現代碼如下:

          public static Node ReverseList2(Node head)
          {
              if (head == null)
              {
                  return null;
              }
      
              Node reverseHead = null;
              // 指針1:當前節點
              Node currentNode = head;
              // 指針2:當前節點的前一個節點
              Node prevNode = null;
      
              while(currentNode != null)
              {
                  // 指針3:當前節點的后一個節點
                  Node nextNode = currentNode.Next;
                  if(nextNode == null)
                  {
                      reverseHead = currentNode;
                  }
                  // 將當前節點的后一個節點指向前一個節點
                  currentNode.Next = prevNode;
                  // 將前一個節點指向當前節點
                  prevNode = currentNode;
                  // 將當前節點指向后一個節點
                  currentNode = nextNode;
              }
      
              return reverseHead;
          }

      三、單元測試

      3.1 測試用例

        (1)為了方便對比,封裝了一個用于將鏈表所有元素輸出為字符串的方法GetNodeString()

          // 輔助方法:生成鏈表元素的字符串用于對比
          public string GetNodeString(Node head)
          {
              if (head == null)
              {
                  return null;
              }
      
              StringBuilder sbResult = new StringBuilder();
              Node temp = head;
              while (temp != null)
              {
                  sbResult.Append(temp.Data.ToString());
                  temp = temp.Next;
              }
      
              return sbResult.ToString();
          } 
      View Code

        (2)功能測試、特殊輸入測試

          // 01.輸入的鏈表有多個結點
          [TestMethod]
          public void ReverseTest1()
          {
              Node node1 = new Node(1);
              Node node2 = new Node(2);
              Node node3 = new Node(3);
              Node node4 = new Node(4);
              Node node5 = new Node(5);
      
              node1.Next = node2;
              node2.Next = node3;
              node3.Next = node4;
              node4.Next = node5;
      
              Node newHead = ListHelper.ReverseList2(node1);
              Assert.AreEqual(GetNodeString(newHead), "54321");
          }
      
          // 02.輸入的鏈表只有一個結點
          [TestMethod]
          public void ReverseTest2()
          {
              Node node1 = new Node(1);
      
              Node newHead = ListHelper.ReverseList2(node1);
              Assert.AreEqual(GetNodeString(newHead), "1");
          }
      
          // 03.輸入NULL
          [TestMethod]
          public void ReverseTest3()
          {
              Node newHead = ListHelper.ReverseList2(null);
              Assert.AreEqual(GetNodeString(newHead), null);
          } 

      3.2 測試結果

       ?。?)測試通過情況

       ?。?)代碼覆蓋率

       

      posted @ 2015-08-29 20:32  EdisonZhou  閱讀(25215)  評論(1)    收藏  舉報
      主站蜘蛛池模板: 国产99在线 | 欧美| 国产精品福利午夜久久香蕉 | 久久精品午夜视频| 精品国产线拍大陆久久尤物| 高清破外女出血AV毛片| 国产老熟女伦老熟妇露脸| 日韩午夜无码精品试看| 男人的天堂av社区在线| 中文在线最新版天堂| 国产SM重味一区二区三区| 亚洲青青草视频在线播放| 秋霞人妻无码中文字幕| 国产中文字幕精品喷潮| 国产一区精品综亚洲av| 婷婷四虎东京热无码群交双飞视频| 国产又色又爽又黄的网站免费| 一二三四免费中文字幕| 里番全彩爆乳女教师| 人妻少妇久久久久久97人妻| av天堂久久精品影音先锋| 午夜福利伦伦电影理论片在线观看| 国产国拍精品av在线观看| 欧美性猛交xxxx乱大交丰满| 亚洲国产成人AⅤ毛片奶水| 亚洲一区久久蜜臀av| 亚洲欧美综合精品成| 狠狠躁夜夜躁人人爽天天bl| 国产福利酱国产一区二区| 日韩精品亚洲专区在线播放| 亚洲熟女片嫩草影院| 午夜亚洲AV日韩AV无码大全| 栾川县| 99久久国产综合精品成人影院| 国产另类ts人妖一区二区| 大邑县| AV最新高清无码专区| 国产亚洲精品俞拍视频| 免费看欧美全黄成人片| 亚洲国产精品一二三区| 久青草国产在视频在线观看| 91精品一区二区蜜桃|