[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;
    }
};

容易出现的问题

  1. 代码很简单,但是在返回之前有一个currptr->next = prevptr;容易遗忘,如果没有这一句,则反转后的头结点和后续的节点是断开的,虽然说后面的都已经是正常反转了,结果类似于5 断开了 4->3->2->1->NULL
发布了127 篇原创文章 · 获赞 219 · 访问量 30万+

猜你喜欢

转载自blog.csdn.net/LoseInVain/article/details/104189146
今日推荐