题目

题目来源:力扣(LeetCode)

反转一个单链表。

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

思路分析

定义一个 prev 指针,指向 null,然后定义一个 curr 指针,指向链表的头节点,即 curr = head,再定义一个 next 指针,指向 curr 指针所指向的节点的下一个节点。

  1. 首先,我们将 curr 指针所指向的节点的next指针指向 prev 指针所指向的节点,即将当前节点的next 指针改为指向前一个节点
  2. 然后将指针 prev 移到 curr 指针所在的位置,即将 prev 指针指向当前节点;保持对当前节点的引用
  3. 接着将 curr 指针移到next指针的位置,即将 curr 指针所指向的节点变为 next 指针所指向的节点;
  4. 此时 curr 指针已经往后移了一位,那么next 指针也应该往后移一位,保持对下一个节点的引用
  5. 重复上述操作,当 curr 指针指向 null 的时候,我们就完成了整个链表的反转
  1. const reverseList = function (head) {
  2. if (!head) return null;
  3. // 首先定义一个 prev 指针指向 null
  4. let prev = null;
  5. // 定义 curr 指针指向 head 节点
  6. let curr = head;
  7. while(curr) {
  8. // 定义一个 next 指针指向当前节点的下一个节点 (curr所指向的节点的next指针域指向的节点)
  9. const next = curr.next;
  10. // 将当前节点的next指针域改为指向前一个节点
  11. curr.next = prev;
  12. // prev 指针移动到 curr 指针的位置,变为指向当前的节点
  13. prev = curr;
  14. // 将 curr 指针移动到 next 指针的位置,curr 指向变为指向next 指针指向的节点
  15. curr = next;
  16. }
  17. // 遍历链表,当 curr 指针指向 null 的时候,说明我们已经完成了链表的反转
  18. return prev
  19. }