美文网首页
206. 反转链表

206. 反转链表

作者: __LXF__ | 来源:发表于2020-03-11 11:34 被阅读0次

    1、题目描述

    反转一个单链表。
    示例:
    输入: 1->2->3->4->5->NULL
    输出: 5->4->3->2->1->NULL

    2、思路

    在遍历列表时,将当前节点的 next 指针改为指向前一个元素。由于节点没有引用其上一个节点,因此必须事先存储其前一个元素。在更改引用之前,还需要另一个指针来存储下一个节点。不要忘记在最后返回新的头引用!
    复杂度分析
    时间复杂度:O(n),假设 n 是列表的长度,时间复杂度是 O(n)。
    空间复杂度:O(1)。

    3、代码实现(C++)

    /**
     * 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;
            } 
            else {
                ListNode* p1 = head;
                ListNode* p2 = p1->next;
                ListNode* p3 = p2->next;   // p3记录p2的next
    
                while (p2 != NULL) {
                    p3 = p2->next;
                    p2->next = p1;
                    p1 = p2;
                    p2 = p3;      // 一次循环结束后,不能马上后移p3(因为当p2指向最后一个节点时,p3已经为空不能再往后移)
                                  // 应该在下一次循环中移动p3
                }
    
                head->next = NULL;
                head = p1;
                return head;
            }
        }
    };
    

    相关文章

      网友评论

          本文标题:206. 反转链表

          本文链接:https://www.haomeiwen.com/subject/ohkqjhtx.html