206. 反转链表

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. 反转链表)