码迷,mamicode.com
首页 > 其他好文 > 详细

反转链表问题

时间:2020-03-27 01:12:35      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:str   ext   示例   img   alt   节点   col   etc   mamicode   

题目描述:
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
 
示例:
输入: 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;
         }

};

 

反转链表问题

标签:str   ext   示例   img   alt   节点   col   etc   mamicode   

原文地址:https://www.cnblogs.com/aaamax/p/12578495.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!