反转链表问题
Posted aaamax
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反转链表问题相关的知识,希望对你有一定的参考价值。
题目描述:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL来源:力扣(LeetCode)
解题思路
1.双指针
1.用pre,cur两个指针分别指向当前节点和前一个节点,初始化:pre=NULL,cur=head;每次都使cur指向pre
2.每次都使cur继续往后遍历,这里因为cur->next发生了改变,应该提前设置一个指针temp=cur->next;pre指向cur即可;
3.直到cur=NULL;
(图片来自于Leetcode)
class Solution { public: ListNode* reverseList(ListNode* head) { ListNode *pre=NULL,*cur=head; while(cur){ ListNode *temp=cur->next; cur->next=pre; pre=cur; cur=temp; } return pre; } };
2.妖魔化的双指针
1.这种方法实际上只用了一个额外指针cur,每次使得head的下一个节点指向cur;
2.cur同时向前移动,head指向改变
class Solution { public: ListNode* reverseList(ListNode* head) { if (head == NULL) { return NULL; } ListNode* cur = head; while (head->next != NULL) { ListNode* t = head->next->next; head->next->next = cur; cur = head->next; head->next = t; //改变head的指向 } return cur; } };
3.递归解题
1.特殊情况,链表为空或者长度为1,此时可以返回head;
2.链表长度大于1,则访问到最后一个元素时开始依次有值回归;
3.每次使得指针的下一个节点指向该指针,并使得该指针指向NULL;
class Solution { public: ListNode* reverseList(ListNode* head) { if(head==NULL||head->next==NULL) return head; ListNode *ret= reverseList(head->next); head->next->next=head; head->next=NULL; return ret; } };
以上是关于反转链表问题的主要内容,如果未能解决你的问题,请参考以下文章