题目一
思路:两次遍历。一次遍历出链表的元素个数。第二次依次插入数据
int* reversePrint(struct ListNode* head, int* returnSize){
int i=0;
struct ListNode*cur=head;
while(head)
{
head=head->next;
i++;
}
*returnSize=i;
int*res=(int*)malloc(sizeof(int)*i);
while(cur)
{
res[--i]=cur->val;
cur=cur->next;
}
return res;
}
题目二
思路:头插法
struct ListNode* reverseList(struct ListNode* head)
{
if(head==NULL)
return head;
struct ListNode*Head=NULL;
while(head)
{
struct ListNode*newnode=head;
struct ListNode*next=head->next;
newnode->next=Head;
Head=newnode;
head=next;
}
return Head;
}
题目三
第一次遍历:先将复制的结点链接在原结点的后面,不管随机指针。
第二次遍历,复制结点的随机指针指向原结点随机指针的下一个结点
第三次遍历:将现在的链表拆分为两个链表;方法为尾插法
class Solution {
public:
Node* copyRandomList(Node* head) {
Node* cur=head;
while(cur)
{
Node* next=cur->next;
Node* newcode=(Node*)malloc(sizeof(Node));
newcode->val=cur->val;
newcode->next=next;
cur->next=newcode;
cur=next;
}
//处理随机指针
cur=head;
while(cur)
{
Node*next=cur->next->next;
Node*newcode=cur->next;
if(cur->random!=NULL)
{
newcode->random=cur->random->next;
}
else
{
newcode->random=NULL;
}
cur=next;
}
//拆为目标链表,使用尾插法
Node*newhead=NULL;
Node*tail=NULL;
cur=head;
while(cur)
{
Node*newcode=cur->next;
Node*next=newcode->next;
if(newhead==NULL)
{
newhead=tail=newcode;
}
else
{
tail->next=newcode;
tail=newcode;
}
cur->next=next;
cur=next;
}
return newhead;
}
};