/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
双实现
1.双指针
虚拟头结点
pre cur
1.tmp=cur->next
2.cur->pre
3.cur=tmp pre cur
*/
/*双指针非递归
struct ListNode* reverseList(struct ListNode* head){
struct ListNode *dummyHead =(struct ListNode *) malloc (sizeof(struct ListNode));//一定要申请
dummyHead ->next= head;
struct ListNode *pre=NULL;
struct ListNode *cur=head;
struct ListNode *tmp=NULL;
while(cur)//终止条件
{
//因为当前节点 断链子 因此要保存下一个
tmp =cur->next;
//将当前指向前一个
cur->next=pre;
//移动先保存在移动 因为pre跟着cur走因此先走pre
pre=cur;
cur=tmp;
}
//return cur;错了 因为最后一次 cur->NULL pre才是cur
return pre;
}*/
//递归版本
struct ListNode* back(struct ListNode* pre,struct ListNode* cur)
{
struct ListNode *tmp=NULL;
if(cur==NULL) return pre;
else{
//因为当前节点 断链子 因此要保存下一个
tmp =cur->next;
//将当前指向前一个
cur->next=pre;
//移动先保存在移动 因为pre跟着cur走因此先走pre
return back(cur,tmp);
}
}
struct ListNode* reverseList(struct ListNode* head){
//return cur;错了 因为最后一次 cur->NULL pre才是cur
return back(NULL,head);
}
C实现 Leecode 206 反转链表 递归双指针
最新推荐文章于 2024-07-21 12:44:58 发布