[leetcode刷题笔记] 反转链表
题目地址: https://leetcode-cn.com/problems/reverse-linked-list/submissions/
题目内容: 反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
链表节点的数据结构可以描述为:
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
反转链表可以用迭代和递归的方法实现,采用迭代的方法较为简单,算法主要维护了三个指针,分别是prev
,curr
,next
分别表示前一个节点,当前节点,下一个节点的指针,在初始的时候,我们把头结点视为当前节点,则前一个节点为NULL
,这点很好理解,因为在反转过程中,头结点就变成了尾节点,而尾节点的后继就是NULL,这样设置是为了整个程序的统一。下一个节点next
就是头结点的后继。在反转过程中,我们让当前节点的后继改变为前一个节点prev
,同时对这三个指针进行“平移”,直到符合next == NULL
为止,此时就不能继续平移了。代码如下:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (!head || !head->next) return head;
ListNode* prevptr = NULL;
ListNode* currptr = head;
ListNode* nextptr = currptr->next;
while(nextptr){
currptr->next = prevptr;
prevptr = currptr;
currptr = nextptr;
nextptr = nextptr->next;
}
currptr->next = prevptr;
return currptr;
}
};
容易出现的问题:
- 代码很简单,但是在返回之前有一个
currptr->next = prevptr;
容易遗忘,如果没有这一句,则反转后的头结点和后续的节点是断开的,虽然说后面的都已经是正常反转了,结果类似于5 断开了 4->3->2->1->NULL
。