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

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

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

      劍指Offer面試題:24.復雜鏈表的復制

      一、題目:復雜鏈表的復制

      題目:請實現函數ComplexListNode Clone(ComplexListNode head),復制一個復雜鏈表。在復雜鏈表中,每個結點除了有一個Next指針指向下一個結點外,還有一個Sibling指向鏈表中的任意結點或者NULL。

        結點的定義如下,采用C#語言描述:

          public class ComplexListNode
          {
              public int Data { get; set; }
              public ComplexListNode Next { get; set; }
              public ComplexListNode Sibling { get; set; }
      
              public ComplexListNode(int data)
              {
                  this.Data = data;
              }
      
              public ComplexListNode(int data, ComplexListNode next, ComplexListNode sibling = null)
              {
                  this.Data = data;
                  this.Next = next;
                  this.Sibling = sibling;
              }
          }

        下圖是一個含有5個結點的復雜鏈表。圖中實線箭頭表示m_pNext指針,虛線箭頭表示m_pSibling指針。為簡單起見,指向NULL的指針沒有畫出。

      二、解題思路

      2.1 O(n2)的普通解法

        第一步是復制原始鏈表上的每一個結點,并用Next節點鏈接起來;

        第二步是設置每個結點的Sibling節點指針。

      對于一個含有n個結點的鏈表,由于定位每個結點的Sibling都需要從鏈表頭結點開始經過O(n)步才能找到,因此這種方法的總時間復雜度是O(n2)

      2.2 借助輔助空間的O(n)解法

        第一步仍然是復制原始鏈表上的每個結點N創建N',然后把這些創建出來的結點用Next鏈接起來。同時我們把<N,N'>的配對信息放到一個哈希表中。

        第二步還是設置復制鏈表上每個結點的m_pSibling。由于有了哈希表,我們可以用O(1)的時間根據S找到S'

      此方法使用空間換時間。對于有n個結點的鏈表我們需要一個大小為O(n)的哈希表,也就是說我們以O(n)的空間消耗把時間復雜度由O(n2)降低到O(n)

      2.3 不借助輔助空間的O(n)解法

        第一步仍然是根據原始鏈表的每個結點N創建對應的N'。(把N'鏈接在N的后面)

          private static void CloneNodes(ComplexListNode head)
          {
              ComplexListNode node = head;
              while (node != null)
              {
                  ComplexListNode cloned = new ComplexListNode();
                  cloned.Data = node.Data;
                  cloned.Next = node.Next;
                  cloned.Sibling = null;
      
                  node.Next = cloned;
                  node = cloned.Next;
              }
          }

        第二步設置復制出來的結點的Sibling。(把N'的Sibling指向N的Sibling)

          private static void ConnectSiblingNodes(ComplexListNode head)
          {
              ComplexListNode node = head;
              while (node != null)
              {
                  ComplexListNode cloned = node.Next;
                  if (node.Sibling != null)
                  {
                      cloned.Sibling = node.Sibling;
                  }
                  node = cloned.Next;
              }
          }

        第三步把這個長鏈表拆分成兩個鏈表:把奇數位置的結點用Next鏈接起來就是原始鏈表,偶數數值的則是復制鏈表。

          private static ComplexListNode ReconnectNodes(ComplexListNode head)
          {
              ComplexListNode node = head;
              ComplexListNode clonedHead = null;
              ComplexListNode clonedNode = null;
      
              if (node != null)
              {
                  clonedHead = clonedNode = node.Next;
                  node.Next = clonedNode.Next;
                  node = node.Next;
              }
      
              while (node != null)
              {
                  // 復制鏈表的連接
                  clonedNode.Next = node.Next;
                  clonedNode = clonedNode.Next;
                  // 原始鏈表的連接
                  node.Next = clonedNode.Next;
                  node = node.Next;
              }
      
              return clonedHead;
          }

        最后,將三個步驟銜接起來形成Clone方法:

          public static ComplexListNode Clone(ComplexListNode head)
          {
              CloneNodes(head);
              ConnectSiblingNodes(head);
              return ReconnectNodes(head);
          }

      三、單元測試

        輔助方法的封裝

          public static void TestPortal(string testName, ComplexListNode head)
          {
              if (!string.IsNullOrEmpty(testName))
              {
                  Console.WriteLine("{0} begins:", testName);
              }
      
              Console.WriteLine("The original list is:");
              PrintList(head);
      
              ComplexListNode clonedHead = Clone(head);
              Console.WriteLine("The cloned list is:");
              PrintList(clonedHead);
          }
      
          private static void PrintList(ComplexListNode head)
          {
              ComplexListNode node = head;
              while (node != null)
              {
                  Console.WriteLine("The value of this node is: {0}.", node.Data);
                  if (node.Sibling != null)
                  {
                      Console.WriteLine("The value of its sibling is: {0}.", node.Sibling.Data);
                  }
                  else
                  {
                      Console.WriteLine("This node does not have a sibling.");
                  }
      
                  Console.WriteLine();
      
                  node = node.Next;
              }
          }
      
          private static void BuildNodes(ComplexListNode node, ComplexListNode next, ComplexListNode sibling)
          {
              if (node != null)
              {
                  node.Next = next;
                  node.Sibling = sibling;
              }
          }
      View Code

        (1)Test1

          //          -----------------
          //         \|/              |
          //  1-------2-------3-------4-------5
          //  |       |      /|\             /|\
          //  --------+--------               |
          //          -------------------------
          public static void Test1()
          {
              ComplexListNode node1 = new ComplexListNode(1);
              ComplexListNode node2 = new ComplexListNode(2);
              ComplexListNode node3 = new ComplexListNode(3);
              ComplexListNode node4 = new ComplexListNode(4);
              ComplexListNode node5 = new ComplexListNode(5);
      
              BuildNodes(node1, node2, node3);
              BuildNodes(node2, node3, node5);
              BuildNodes(node3, node4, null);
              BuildNodes(node4, node5, node2);
      
              TestPortal("Test1", node1);
          }

        (2)Test2

          // Sibling指向結點自身
          //          -----------------
          //         \|/              |
          //  1-------2-------3-------4-------5
          //         |       | /|\           /|\
          //         |       | --             |
          //         |------------------------|
          public static void Test2()
          {
              ComplexListNode node1 = new ComplexListNode(1);
              ComplexListNode node2 = new ComplexListNode(2);
              ComplexListNode node3 = new ComplexListNode(3);
              ComplexListNode node4 = new ComplexListNode(4);
              ComplexListNode node5 = new ComplexListNode(5);
      
              BuildNodes(node1, node2, null);
              BuildNodes(node2, node3, node5);
              BuildNodes(node3, node4, node3);
              BuildNodes(node4, node5, node2);
      
              TestPortal("Test2", node1);
          }

        (3)Test3

          // Sibling形成環
          //          -----------------
          //         \|/              |
          //  1-------2-------3-------4-------5
          //          |              /|\
          //          |               |
          //          |---------------|
          public static void Test3()
          {
              ComplexListNode node1 = new ComplexListNode(1);
              ComplexListNode node2 = new ComplexListNode(2);
              ComplexListNode node3 = new ComplexListNode(3);
              ComplexListNode node4 = new ComplexListNode(4);
              ComplexListNode node5 = new ComplexListNode(5);
      
              BuildNodes(node1, node2, null);
              BuildNodes(node2, node3, node4);
              BuildNodes(node3, node4, null);
              BuildNodes(node4, node5, node2);
      
              TestPortal("Test3", node1);
          }

        (4)Test4

          // 只有一個結點
          public static void Test4()
          {
              ComplexListNode node1 = new ComplexListNode(1);
              node1.Sibling = node1;
      
              TestPortal("Test4", node1);
          }

        (5)Test5

          // 魯棒性測試
          public static void Test5()
          {
              TestPortal("Test5", null);
          }

       

      posted @ 2015-09-07 23:22  EdisonZhou  閱讀(5539)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 乱女乱妇熟女熟妇综合网| 日韩V欧美V中文在线| 色综合天天综合网天天看片| 峨眉山市| 国产精品无码av在线一区| 天堂中文8资源在线8| 日韩国产欧美精品在线| 波多野结衣久久一区二区| 亚洲综合视频一区二区三区| 电影在线观看+伦理片| 精品一区二区亚洲国产| 真人无码作爱免费视频| 国产av一区二区不卡| 欧日韩无套内射变态| 91精品蜜臀国产综合久久| 国产精品天天看天天狠| 亚洲人成网站999久久久综合| 国产精品白浆无码流出| 亚洲一区二区三午夜福利| 国产免费视频一区二区| 国产精品久久久一区二区三区| 免费成人网一区二区天堂| 国产精品福利自产拍久久| 蜜臀久久精品亚洲一区| 久久久久无码中| 欧美老熟妇乱子伦牲交视频| 国产精品久久久久aaaa| 久久亚洲av综合悠悠色| 风韵丰满熟妇啪啪区老老熟妇| 国产一区二区不卡91| 国产色婷婷亚洲99精品小说| 加勒比无码av中文字幕| 亚洲熟妇精品一区二区| 四虎女优在线视频免费看| 国产精品久久久久乳精品爆| 精品视频不卡免费观看| 大又大又粗又硬又爽少妇毛片| 欧美性猛交xxxx富婆| 国精品无码一区二区三区左线| 九九热免费在线视频观看| 中文字幕日韩精品国产|