反转链表
描述:1->2->3->4 反转成4->3->2->1
第一方法:迭代
思路:将当前节点的next指针改为指向前一个节点。
注意点:
(1)由于节点没有引用其前一个节点,所以需要存储上一个节点。
(2)因为将next指针指向前一个节点,那下一个节点需要临时存储起来,以便向下继续遍历链表
代码:
class Solution {
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}
}
复杂度分析:
时间:O(n)
空间:O(1)
第二种方法:头插法
思路:构建一个空的头节点,然后遍历链表,将其插入到空的头节点的下一个位置。
复杂度分析:
时间:O(n)
空间:O(1)
第三种方法:递归
思路:
使用递归的思路:
(1)递归终结点的处理:终结点为nm,将其作为返回头节点
(2)递归中间流程的处理:head.next.next = head
(3)递归起始点,头节点的处理:head.next = null,避免出现环
代码:
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
}
}
复杂度:
时间:O(n)
空间:O(n)