反转一个单链表
题目源于领扣:https://leetcode-cn.com/problems/reverse-linked-list/description/
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题
题目分析
- 因为一个单个链表结点有前驱和后继,所以我们不能像顺序表那样直接交换元素。
- 我们需要三个指针
prev,cur,_next
来完整的处理节点间的关系。
过程如图:
如图解:
注意
1.prev
的功能是将头结点的next
变为空,并且标记被操作结点的新next
,cur
始终是被操作结点,_next
始终标记结点原来的next
,保持链表不断裂。
2. 这里的指针位置变换,很容易被绕进去,比如:prev=cur
,可以读成prev
变成cur
,这样理解会比较好顺思路一些,写的时候也会好想一点。
3. 循环走到最后的时候,prev
指向新的头结点,再返回的的时候,记得返回的是prev
,或者也可以多写一句,将prev
赋给head
,再返回head
。
/**
* 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) {
//当链表只有一个结点或者链表为空的时候
if(head==NULL || head->next==NULL)
{
return head;
}
ListNode* prev=NULL;
ListNode* cur=head;
ListNode* _next=NULL;
while(cur)
{
_next=cur->next;
cur->next=prev;
prev=cur;
cur=_next;
}
return prev;
}
};