再用一个指针遍历一遍原链表,每到达一个结点A记录下它在链表中的位置,并跳转到random指向的结点B,再由另一个结点从链表头开始,直到走到random跳转之后的结点,记录下来结点B在链表位置,这样就可以得到结点A和它的random指向的结点B的相对位置关系。再在新链表中根据关系令random指向相应的结点。
方法一:定义一个cur用来遍历原链表,定义一个copy指针用作拷贝
让copy=cur->next , cur->next=copy, cur= copy->next
struct Node *cur = head;
while(cur)
{
struct Node *copy = (struct Node *)malloc(sizeof(struct Node));
copy->val = cur->val;
copy->next = cur->next;
cur->next = copy;
cur = copy->next;
}
注意这里是对于链表进行的拷贝,而不是简单的进行链表的链接,因此需要构造新的结点再进行拷贝
方法二:定义一个cur用来遍历原链表,一个next来找cur的next,一个copy用作拷贝
有了next就不用在乎拷贝顺序了
next=cur->next, cur-> next=copy, copy->next= next
链接拷贝结点的random
copy->random指向前面cur->random->next
以为cur->random的后一个就是它的copy,这样直接就找到了相对位置的copy
如果cur->random指向NULL,copy->random直接指向NULL
struct Node *copy = NULL;
cur = head;
while(cur)
{
copy = cur->next;
if(cur->random == NULL)
{
copy->random = NULL;
}
else
{
copy->random = cur->random->next;
}
cur = copy->next;
}
把copy从原链表中解下来,形成复制链表,把原链表连回去
创建拷贝链表的头指针copyHead还有尾指针copyTail
尾指针是为了尾插结点,头指针是为了定位
创建一个next指针便于再原链表上辅助copy和cur移动
copy将值赋给拷贝链表,cur负责连接原链表
cur = head;
struct Node *copyHead = NULL;
struct Node *copyTail = NULL;
while(cur)
{
struct Node *copy = cur->next;
struct Node *next = copy->next;
cur->next = next;
if(copyTail == NULL)
{
copyHead = copyTail = copy;
}
else
{
copyTail->next = copy;
copyTail = copyTail->next;
}
cur = next;
}
return copyHead;
可以看成构建新的链表