反转链表
1.问题描述
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
2.求解
迭代双指针
- 定义前指针cur和后指针pre
- 每次让pre的next指向cur
- 完成后两个指针向分别后移动一位

代码如下
/*
执行用时:0 ms, 在所有 Java 提交中击败了100.00% 的用户
内存消耗:38 MB, 在所有 Java 提交中击败了91.05% 的用户
*/
public ListNode reverseList(ListNode head) {
ListNode cur = null;
ListNode pre = head;
while(pre != null){
ListNode temp = pre.next;
pre.next = cur;
cur = pre;
pre = temp;
}
return cur;
}
- 时间复杂度:O(n)
- 空间复杂度:O(1)
迭代双指针二

代码如下
/*
执行用时:0 ms, 在所有 Java 提交中击败了100.00% 的用户
内存消耗:38.1 MB, 在所有 Java 提交中击败了84.86% 的用户
*/
public ListNode reverseList(ListNode head) {
if(head == null){
return null;
}
ListNode cur = head;
while(head.next != null){
ListNode temp = head.next.next;
head.next.next = cur;
cur = head.next;
head.next = temp;
}
return cur;
}
递归
- 先递归到尾节点记为ret
- 返回过程中对每一个节点执行以下操作
- 令当前节点的下一个节点指向该节点
- 令当前节点指向null

代码如下
/*
执行用时:0 ms, 在所有 Java 提交中击败了100.00% 的用户
内存消耗:38.4 MB, 在所有 Java 提交中击败了62.07% 的用户
*/
public ListNode reverseList(ListNode head) {
if(head == null || head.next == null){
return head;
}
ListNode ret = reverseList(head.next);
head.next.next = head;
head.next = null;
return ret;
}
- 时间复杂度:O(n)
- 空间复杂度:O(n)

浙公网安备 33010602011771号