翻转一个链表,这题至少有两种做法, 一个是recursion, 一个是iterative的解法。
两种都要会。
对于链表问题,一定要画图。
先写recursion的
base case: 如果head == null || head.next == null, 这时返回head就好了。
正常case: 1-> 2 -> 3
让recursion去处理 2-3
把2的next接到1
把1的next接地。
然后返回2-3 他俩翻转后的head就好了
代码见下:
class Solution {
public ListNode reverseList(ListNode head) {
return recursionWay(head);
}
private ListNode recursionWay(ListNode head) {
// base case
if (head == null || head.next == null) return head;
// 1 -> 2 -> 3 . => 1, 2 -> 3
ListNode realHead = recursionWay(head.next);
head.next.next = head; // 2 -> 1
head.next = null; // 1 -\> 2
return realHead;
}
}
C++版本
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (head == NULL || head->next == NULL) return head;
ListNode* realHead = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return realHead;
}
};
再写Iterative的
对于 1-> 2 -> 3这个例子, 就是借用一个prev变量来保留上一个node,
把当前node 的next指向prev, 更新prev和head,(同时要早早的把head.next保下来,否则丢了head)
最后返回prev。
class Solution {
public ListNode reverseList(ListNode head) {
// 1 -> 2 -> 3
// prev <- 1,
// prev = 1, head = 2 -> 3
ListNode prev = null;
while (head != null) {
ListNode next = head.next;
head.next = prev;
prev = head;
head = next;
}
return prev;
}
}
C++ 版本
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* prev = NULL;
while (head != NULL) {
ListNode* next = head->next;
head->next = prev;
prev = head;
head = next;
}
return prev;
}
};
网友评论