leetcode 206.反转链表
切记做链表的题一定要画图!!!
1. 图解
思路: 链表反转主要是通过头插法完成
2. 代码实现
2.1 直接反转(法一)
public ListNode reverseList(ListNode head) {
ListNode prevNode = null; // cur的前一个节点, 即反转后链表的头节点
ListNode cur = head; // cur 从头节点开始遍历
while (cur != null) {
ListNode curNext = cur.next; // 保留cur的一下个节点
// 如果没有保留cur 的下一个节点,下面的代码会导致死循环
cur.next = prevNode;
prevNode = cur;
cur = curNext; // 下一个节点
}
return prevNode;
}
复杂度分析:
时间复杂度 O(N) : 遍历链表使用线性大小时间。
空间复杂度 O(1) : 变量 pre 和 cur 使用常数大小额外空间。
2.2 虚拟节点法(法二)
好处:通过虚拟节点可以很方便的解决头节点的问题
坏处:面试的时候可能不会被允许
public ListNode reverseList(ListNode head) {
ListNode dummy = new ListNode(-1);
ListNode cur = head;
while (cur != null) {
ListNode next = cur.next;
cur.next = dummy.next;
dummy.next = cur;
cur = next;
}
return dummy.next;
}