# 206 反转链表

来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/fan-zhuan-lian-biao-lcof

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

# 一、题目描述

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

示例:

输入: 1->2->3->4->5->NULL

输出: 5->4->3->2->1->NULL   限制:

0 <= 节点个数 <= 5000

# 二、思路

  1. 定义三个指针,分别指向当前结点的前一个结点,当前结点,当前结点的下一个结点。

  2. 先保存当前结点的下一个结点,防止断链,然后将当前结点的 next 指向它的前一个结点,这样就实现单个结点的反转,之后将当前结点和当前结点的前一个结点向后移动,注意顺序。

  3. 当前结点是尾结点的时候,将当前结点赋给新表头,实现链表反转。

代码实现:

class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        if (pHead == NULL)
            return pHead;
        ListNode* pNow, *pPre = NULL, *pNext, *newHead;
        pNow = pHead;
        while (pNow) {
            pNext = pNow->next;
            
            if (pNext == NULL)
            {
                newHead = pNow;
            }
            pNow->next = pPre;
            pPre = pNow;
            pNow = pNext;
        }
        return newHead;
    }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21