[leetcode]206. 反转链表

45 阅读1分钟

题目

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

输入: head = [1,2,3,4,5]
输出: [5,4,3,2,1]

示例 2:

输入: head = [1,2]
输出: [2,1]

示例 3:

输入: head = []
输出: []

 

提示:

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

 

进阶: 链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

思路

这道题比较简单,迭代法总共需要记住三个节点,前继节点,当前节点,后继节点,将前继和后继更换一下位置,核心就三行: 当前节点->next = 前继节点; 当前节点->pre = 后继节点; 当前节点 = 后继节点;

链表反转是算法学习中的重要基础。先扎实掌握经典解法,再循序渐进挑战更高难度的题目。例如后续有两道进阶题型:

  1. 局部反转leetcode.cn/problems/re…
  2. K个一组反转(leetcode.cn/problems/re…)

当基础解法熟练后,这些复杂问题便能迎刃而解。

解答

class Solution {
    public ListNode reverseList(ListNode head) {
        if (head == null || head.getNext() == null) {
            return head;
        }

        ListNode headCopy = head;

        ListNode pre = head;
        ListNode cur = head.getNext();
        ListNode next;
        while (cur != null) {
            next = cur.getNext();
            cur.setNext(pre);
            pre = cur;
            cur = next;
        }
        headCopy.setNext(null);

        ListNode newHead = pre;
        return newHead;
    }
}