206. 反转链表
Posted 2016bits
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了206. 反转链表相关的知识,希望对你有一定的参考价值。
一、题目描述
反转一个单链表。
二、示例
输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
三、基本思路
1、递归法
递归弄清楚两个基本部分:递归部分和终止条件
原问题:
递归部分:将从2开始的结点进行Reverse,然后将2的next指向1,并将1指向NULL
终止条件:Reverse部分只含一个结点或为空(当原问题中只含一个结点时,其子问题的Reverse部分为空)
2、迭代法 迭代法也要弄清两部分:迭代过程和终止条件
迭代部分:注意观察图中迭代前p、q与迭代后p、q的变化。在改变指针之前务必先保存原有链的信息(即r = q->next),然后再断链,更新p、q
终止条件:q指向部分为空
迭代完成后,注意更新新链的头和尾,即:尾部为空(head->next = nullptr),新头为p
四、代码
1、递归法
/**
* Definition for singly-linked list.
* struct ListNode
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr)
* ListNode(int x) : val(x), next(nullptr)
* ListNode(int x, ListNode *next) : val(x), next(next)
* ;
*/
class Solution
public:
ListNode* reverseList(ListNode* head)
if (head == nullptr || head->next == nullptr)
return head;
ListNode *nhead = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return nhead;
;
2、迭代法
/**
* Definition for singly-linked list.
* struct ListNode
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr)
* ListNode(int x) : val(x), next(nullptr)
* ListNode(int x, ListNode *next) : val(x), next(next)
* ;
*/
class Solution
public:
ListNode* reverseList(ListNode* head)
if (head == nullptr || head->next == nullptr)
return head;
ListNode *p = head, *q = head->next, *r;
while (q != nullptr)
r = q->next;
q->next = p;
p = q;
q = r;
head->next = nullptr;
return p;
;
以上是关于206. 反转链表的主要内容,如果未能解决你的问题,请参考以下文章