博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Lintcode】 035.Reverse Linked List
阅读量:4560 次
发布时间:2019-06-08

本文共 2203 字,大约阅读时间需要 7 分钟。

题目:

Reverse a linked list.

Example

For linked list 1->2->3, the reversed linked list is 3->2->1

题解:

Solution 1 ()

class Solution {public:    ListNode *reverse(ListNode *head) {        if (!head) {            return head;        }        ListNode *prev = nullptr;        while (head) {            ListNode *tmp = head->next;            head->next = prev;            prev = head;            head = tmp;        }                return prev;    }};

  The basic idea of this recursive solution is to reverse all the following nodes after head. Then we need to set head to be the final node in the reversed list. We simply set its next node in the original list (head -> next) to point to it and sets its next to be NULL.

Solution 2 ()

class Solution {public:       ListNode* reverseList(ListNode* head) {        if (!head || !(head -> next)) return head;        ListNode* node = reverseList(head -> next);        head -> next -> next = head;        head -> next = NULL;        return node;     }};

 

疑问?为啥下面这段程序是错的

class Solution {public:    ListNode *reverse(ListNode *head) {        if (!head) {            return head;        }        ListNode *prev = nullptr;        while (head) {            ListNode *tmp = head;            head->next = prev;            prev = head;            head = tmp->next;        }                return prev;    }};

  若一定要tmp保存head,那么程序应该如下

class Solution {public:    ListNode *reverse(ListNode *head) {        if (!head) {            return head;        }        ListNode *prev = nullptr;        while (head) {            ListNode *tmp = new ListNode(-1);            *tmp = *head;            head->next = prev;            prev = head;            head = tmp->next;            delete tmp;        }                return prev;    }};

 

解惑:

int main(){    ListNode* tmp = new ListNode(0);    ListNode* p = new ListNode(1);    ListNode* q = new ListNode(2);    ListNode* r = new ListNode(3);    ListNode** t = &tmp;    tmp->next = p;    p->next = q;    q->next = r;        t = &((*t)->next);    (*t) = (*t)->next;    cout << (*t)->val << endl;    cout << tmp->next->val << endl;    cout << (*p).val << endl;        return 0;}

输出为:2 2 1

转载于:https://www.cnblogs.com/Atanisi/p/6838515.html

你可能感兴趣的文章
构建之法阅读笔记之四
查看>>
10.15习题2
查看>>
Windows Server 2008 R2 备份与恢复详细实例
查看>>
Ubuntu上kubeadm安装Kubernetes集群
查看>>
关于java学习中的一些易错点(基础篇)
查看>>
MFC的多国语言界面的实现
查看>>
四则运算个人项目 最终版
查看>>
angular学习之angular-phonecat项目的实现
查看>>
KMP算法
查看>>
DS博客作业07--查找
查看>>
javascript常用对象
查看>>
loadrunner测试socket协议程序知识汇总(转)
查看>>
SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?...
查看>>
凯撒密码、GDP格式化输出、99乘法表
查看>>
SQL Server 2008 分区函数和分区表详解(转)
查看>>
ASP.NET缓存全解析(转)
查看>>
java线程系列---java5中的线程池
查看>>
SQL表连接
查看>>
新秀系列C/C++经典问题(四)
查看>>
memset函数具体说明
查看>>