反转一个单链表。

示例:

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

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

题解

迭代

迭代还是很容易理解的,就是设置一个prev,然后交换即可

  1. next = cur.next
  2. cur.next = prev
  3. prev = cur
  4. cur = next

JavaScript

  1. var reverseList = function(head) {
  2. let prev = null;
  3. let curr = head;
  4. while (curr) {
  5. // 交换
  6. const next = curr.next;
  7. curr.next = prev;
  8. prev = curr;
  9. // 往下一个节点走
  10. curr = next;
  11. }
  12. return prev;
  13. };

Python

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        if not head or not head.next:
            return head

        pre=None
        cur = head
        while cur:
            next=cur.next
            cur.next=pre
            pre=cur
            cur=next
        return pre

递归

可能有点不好理解,慢慢理解吧

  • 使用递归函数,一直递归到链表的最后一个结点,该结点就是反转后的头结点,记作ret
  • 此后,每次函数在返回的过程中,让当前结点的下一个结点的next指针指向当前节点
  • 同时让当前结点的next指针指向NULL ,从而实现从链表尾部开始的局部反转
  • 当递归函数全部出栈后,链表反转完成

8951bc3b8b7eb4da2a46063c1bb96932e7a69910c0a93d973bd8aa5517e59fc8.gif

var reverseList = function(head) {
    if (head == null || head.next == null) {
        return head;
    }
    const newHead = reverseList(head.next);
    head.next.next = head;
    head.next = null;
    return newHead;
};