Leetcode NO.206 Reverse Linked List


已经大概一个半月没有刷题了,今天开始恢复刷题。。当然,本周主要是刷简单题+做过的题压压惊并找找状态。。大概找个四五天再开始大量刷新题。。这学期课少,感觉好堕落。。连题也没怎么刷。。。目标是在6月中旬完成Leetcode所有题目,这样之后就基本是刷老题了。。之后再主刷CC 150.。

一个半月没刷题,果然状态下降明显,一道超简单的题写了20多分钟。。。

题目要求如下:

Reverse a singly linked list.

Hint:

A linked list can be reversed either iteratively or recursively. Could you implement both?

没有任何多余的要求,就是反转链表,我的思路是先找到最后一个node,然后用recursive的方法解决的。。代码很简单,没有太多可以解释的,这种题就是基本功题。。

/**
 * 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;
    }
};






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值