206. 反转单链表 Reverse Linked List
题目描述
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
Given the head of a singly linked list, reverse the list, and return the reversed list.
输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]
输入:head = [1,2]输出:[2,1]
输入:head = []输出:[]解题方法
方法一:双指针迭代
- 思路:
- 定义俩指针,pre指针指向null,cur指针指向head,然后去遍历移动cur指针,当cur为null时,pre就指向最后一个节点了
- 步骤:
- 定义 pre 指针指向 null,cur 指针指向 head
- 遍历 cur 指针,将 cur 的 next 节点赋值给 pre, 即反转节点指向
- 向右移动 pre 和 cur 节点
- 当 cur 指针为 null 时,pre 指针指向最后一个节点,此时返回 pre
- 复杂度分析:
- 时间复杂度:O(N), N 为链表长度
- 空间复杂度:O(1), 没有数组/矩阵,存储单个值
/** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } *//** * @param {ListNode} head * @return {ListNode} */var reverseList = function(head) { let cur = head let pre = null
while(cur !== null) { const temp = cur.next cur.next = pre pre = cur cur = temp }
return pre};方法二:递归
- 复杂度分析:
- 时间复杂度:O(N), N 为链表长度
- 空间复杂度:O(N), N 为链表长度
/** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } *//** * @param {ListNode} head * @return {ListNode} */var reverseList = function(head) { if (head === null || head.next === null) { return head } let newHead = new reverseList(head.next) head.next.next = head head.next = null
return newHead};