已经大概一个半月没有刷题了,今天开始恢复刷题。。当然,本周主要是刷简单题+做过的题压压惊并找找状态。。大概找个四五天再开始大量刷新题。。这学期课少,感觉好堕落。。连题也没怎么刷。。。目标是在6月中旬完成Leetcode所有题目,这样之后就基本是刷老题了。。之后再主刷CC 150.。
一个半月没刷题,果然状态下降明显,一道超简单的题写了20多分钟。。。
题目要求如下:
Reverse a singly linked list.
Hint:
没有任何多余的要求,就是反转链表,我的思路是先找到最后一个node,然后用recursive的方法解决的。。代码很简单,没有太多可以解释的,这种题就是基本功题。。
A linked list can be reversed either iteratively or recursively. Could you implement both?
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
// get the last node;
ListNode* ret = head;
while (ret != NULL and ret->next != NULL) {
ret = ret->next;
}
reverse(head);
return ret;
}
private:
void reverse(ListNode* head) {
if (head == NULL or head->next == NULL)
return;
ListNode* tmp = head->next;
reverse(tmp);
tmp->next = head;
head->next = NULL;
}
};
注:本题我只用了recursive的方法,基本所有题我第一遍的目标都是只是去实现他们,第二遍主要让自己更加熟练,第三遍才是完成题目所有的follow up,这个工作基本是要在7月多开始干。。
现在再来补充一下iterative版的算法:
本图大致说明了一下我的实现方法,
step 0是准备
从step 1 - step 3是循环的代码:
step 1:
after = after->next;
cur->next->next = head;
step 2:
head = cur->next;
step 3:
cur->next = after;
step 3之后,又变成了跟step 0一样的模式,继续循环。。
循环结束后,tmp是最后一个node,after指向nullptr。
完整代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (head == nullptr or head->next == nullptr) {
return head;
}
ListNode* cur = new ListNode(0);
ListNode* after = head->next;
head->next = nullptr;
cur->next = after;
while (after != nullptr) {
after = after->next;
cur->next->next = head;
head = cur->next;
cur->next = after;
}
return head;
}
};