反转链表问题

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;
         }

};

 

以上是关于反转链表问题的主要内容,如果未能解决你的问题,请参考以下文章

三行代码解反转链表

链表反转

如何在 BackStack 上反转片段动画?

使用 C++ 反转句子中的每个单词需要对我的代码片段进行代码优化

反转链表

c语言,链表的反转,请写出代码,并讲解下,谢了!!!!!