35. 反转链表

目录

链接:

题目:

思路:

代码:

图片:


链接:

原题链接

题目:

定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。

思考题:

  • 请同时实现迭代版本和递归版本。

数据范围

链表长度 [0,30][0,30]。

样例

输入:1->2->3->4->5->NULL

输出:5->4->3->2->1->NULL

思路:

好难,想了好久才想清楚qaq

把链表顺序改变,用两个指针不断地移动,改变方向,引入第三个指针保存地址,pre表示原来在前面的,cur表示现在的指针,相当于把pre->cur转换成为pre<-cur,把这两个指针看成一个整体,一次移动一个元素单位,最后面是cur指向NULL,pre就是新的链表的头节点,返回pre就可以了

代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* pre=nullptr;
        auto cur=head;
        while(cur)
        {
            auto c=cur->next;
            cur->next=pre;//这一步是核心代码,转换链表方向
            pre=cur;
            cur=c;
        }
        return pre;
    }
};

图片:

35. 反转链表_第1张图片

 

你可能感兴趣的:(算法刷题,链表,数据结构)