LeetCode 0206 Reverse Linked List
作者:互联网
1. 题目描述
2. Solution 1
1、思路分析
方法一: 遍历,逐个摘下结点,头插到新链表
2、代码实现
package Q0299.Q0206ReverseLinkedList;
import DataStructure.ListNode;
public class Solution1 {
/*
方法一: 遍历,逐个摘下结点,头插到新链表
*/
public ListNode reverseList(ListNode head) {
ListNode p, r; // p 为工作指针,r为p后继,防断链
p = head;
ListNode dummy = new ListNode(0);
while (p != null) {
r = p.next;
p.next = dummy.next;
dummy.next = p;
p = r;
}
return dummy.next;
}
}
3、复杂度分析
时间复杂度: O(n)
空间复杂度: O(1)
3. Solution 2
1、思路分析
方法二: 设pre、p和r指向3个相邻的结点,假设经过若干的操作后,pre之前的结点指针都已调整完毕。现在令p结点的next域指向pre,注意到一旦调整指针的指向后,p的后继结点就会断链,为此需要用r来指向原p的后继。
注意:
在处理第一个结点时,应将其next域置为NULL,而不是指向头结点(因为它是结果链表的尾结点);
a) 初始态
对应操作
ListNode pre = null, p = head, r = p.next;
p.next = null;
b) 反转操作
对应操作
pre = p;
p = r;
r = r.next;
p.next = pre;
可以看到,r是下一个待处理的结点,所以退出迭代循环的条件是r为空。
2、代码实现
package Q0299.Q0206ReverseLinkedList;
import DataStructure.ListNode;
public class Solution2 {
/*
方法二: 设pre、p和r指向3个相邻的结点,假设经过若干的操作后,pre之前的结点指针都已调整完毕。
现在令p结点的next域指向pre,注意到一旦调整指针的指向后,p的后继结点就会断链,为此需要用r
来指向原p的后继。
注意:
在处理第一个结点时,应将其next域置为NULL,而不是指向头结点(因为它是结果
链表的尾结点);
*/
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) return head;
ListNode pre, p = head, r = p.next;
p.next = null;
while (r != null) {
pre = p;
p = r;
r = r.next;
p.next = pre;
}
return p;
}
}
3、复杂度分析
时间复杂度: O(n)
空间复杂度: O(1)
4. Solution 3
1、思路分析
Solution 2的递归实现。
2、代码实现
package Q0299.Q0206ReverseLinkedList;
import DataStructure.ListNode;
/*
method 3: recursive solution
*/
public class Solution3 {
public ListNode reverseList(ListNode head) {
return reverseListAux(head, null);
}
private ListNode reverseListAux(ListNode p, ListNode pre) {
if (p == null) return pre;
ListNode r = p.next;
p.next = pre;
return reverseListAux(r, p);
}
}
3、复杂度分析
时间复杂度: O(n)
空间复杂度: O(n)
标签:pre,结点,ListNode,复杂度,List,head,next,0206,Linked 来源: https://www.cnblogs.com/junstat/p/16339970.html