题意以及限制条件
-
题目:
-
限制条件:A linked list can be reversed either iteratively or recursively. Could you implement both?
想到的所有可能解法
-
Ways_1——迭代法:双指针
- 时间复杂度——O(n);空间复杂度——O(1);
- newNode:用来转置链表中结点的next域指向以及指向所有转置完成后的第一个结点;
- next:用于移动head指针,直到head == null;
- 核心思想——每次翻转两个节点,直到最后一个结点。
-
Ways_2——递归1
- 时间复杂度——O(n);空间复杂度——O(n);
- Ps: (head == null)-针对的是:空链表的输入;(head.next == null)-针对的是:大多数正常链表的输入情况;
- 核心思想——把整个链表看成“头节点+不包含头节点部分”所组成的:头节点部分的操作为Current Logic;其余部分的操作则为Drill Down。
-
Ways_3——递归2
- 时间复杂度——O(n);空间复杂度——O(n);
- 核心思想——每次翻转两个节点,直到最后一个结点。
对应的代码
- Ways_1
class Solution {
public ListNode reverseList(ListNode head) {
ListNode newNode = null;
while (head != null) {
ListNode next = head.next;
head.next = newNode;
newNode = head;
head = next;
}
return newNode;
}
}
- Ways_2
class Solution {
public ListNode reverseList(ListNode head) {
//Terminator
if (head == null || head.next == null)
return head;
//Drill Down
ListNode newNode = reverseList(head.next);
//Current Logic
//head的下一个结点的next域指向head
head.next.next = head;
head.next = null;
return newNode;
//Restore Current Data
}
}
- Ways_3
class Solution {
public ListNode reverseList(ListNode head) {
return reverse(head, null);
}
public static ListNode reverse(ListNode head, ListNode newNode) {
//Terminator
if (head == null)
return newNode;
//Current Logic
ListNode next = head.next;
head.next = newNode;
//Drill Down
return reverse(next, head);
//Restore Current Data
}
}