复杂链表的复制

来源:互联网 发布:mac的ppt怎么调16:9 编辑:程序博客网 时间:2024/06/11 20:17

de关于复杂链表:
向复杂链表的复制。一个链表的每个节点,有一个指向next指针指向下一个节点,还有一个bext2指针指向这个链表中的一个随机节点或者NULL
实现代码如下:

#pragma once#include<stdio.h>#include<malloc.h>typedef int DataType;typedef struct HardList{ DataType Data; struct HardList *next; struct HardList *next2;}HardList;HardList* _BuyNode(DataType x)//初始化{ HardList *tmp = (HardList*)malloc(sizeof(HardList)); tmp->Data = x; tmp->next = NULL; tmp->next2 = NULL; return tmp;}void PushBack(HardList* &pHead, DataType x){ if (pHead == NULL)  pHead = _BuyNode(x); else {  HardList *tial = pHead;  while (tial->next != NULL)  {   tial = tial->next;  }  tial->next = _BuyNode(x); }}HardList* Find(HardList*& pHead, DataType x){ HardList* cur = pHead; while (cur) {  if (cur->Data == x)  {   return cur;  }  cur = cur->next; } return NULL;}void PrintSlist(HardList* &pHead){ if (pHead == NULL) {  printf("空链表\n");  return; } HardList *cur = pHead; while (cur) {  printf("%d->", cur->Data);  cur = cur->next; } printf("NULL\n");}HardList* CopyList(HardList* &pHead){ if (pHead == NULL)  return NULL; HardList *cur = pHead; while (cur) {  HardList *tmp = _BuyNode(cur->Data);  //tmp->next2=  tmp->next = cur->next;  cur->next = tmp;  cur = cur->next->next;//cur=null } //HardList *tmp = _BuyNode(cur->Data); //tmp->next = cur->next; //cur->next = tmp;//完成复制 //下一步完成next2的复制 cur = pHead; while (cur) {  HardList  *p = cur->next;  if (cur->next2&&p)  {   p->next2 = cur->next2->next;  }  cur = cur->next->next; }//完成next2的复制 //拆分 HardList *p = pHead; HardList *q = p->next; HardList *ret = pHead->next; while (p->next->next) {  //if (p->next)  q = p->next;  p->next = q->next;  p = p->next;  q->next = p->next;  //p = p->next; } p->next = NULL; PrintSlist(ret); return ret;}


wKiom1biXb2CG9BHAAAiOBSanlg986.png

每个节点的结构为:

typedef struct HardList

{

 DataType Data;

 struct HardList *next;

 struct HardList *next2;


}HardList;


先创建好单链表,考虑next2这个分量,则需要O(n^2)的时间复杂度

这里我们采用一种巧妙的方法wKiom1biXevzPkq4AAAcFZ1b55w536.png

通过对每一个节点进行复制并插入到原节点的后方,则复制的节点的next2 指针指向的节点则在原节点next2指针的的下一个位置,这样就能够找到复制的节点的next2 指针,然后将奇数位置与偶数位置的节点进行拆分,这样完成了复杂链表的复制



题的思路在于 如何找到节点的next2指针,我们将每一个指针的拷贝插入到原节点之后,这样既完成了每一个节点的复制,又能方便找到复制的链表的next2指针指向的位置:


wKiom1biXhSwHakjAAAvXtL5BY4900.png


wKioL1biXrHQAyovAAAkuIDxkM0609.png



本文出自 “10945910” 博客,请务必保留此出处http://10955910.blog.51cto.com/10945910/1749927

0 0
原创粉丝点击