LeetCode:链表逆置
2016-07-10 20:23
459 查看
Reverse Linked List
1、题目描述:Reverse a singly linked list.
click to show more hints.
Hint:
A linked list can be reversed either iteratively or recursively. Could you implement both?
2、代码:
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: // void reList(ListNode * &head,ListNode *pre)// recursively // { // if(head->next) // { // ListNode *p=head->next; // head->next=pre; // pre=head; // head=p; // reList(head,pre); // } // else // { // head->next=pre; // } // } ListNode* reverseList(ListNode* head) { if(!head||!(head->next)) { return head; } // ListNode *pre=nullptr; //iteratively // for(ListNode *p=head;p!=nullptr;) // { // ListNode *p1=p->next; // p->next=pre; // pre=p; // p=p1; // } // return pre; // reList(head,nullptr); // return head; /*参考后面别人代码所写recursively*/ // ListNode *p=reverseList(head->next); // head->next->next=head; // head->next=nullptr; ////执行后会被调用函数再次修改,由里到外 // return p; /*参考后面别人代码所写iteratively*/ ListNode *pre=nullptr,*cur=head; while(cur) { ListNode *nextNode=cur->next; cur->next=pre; pre=cur; cur=nextNode; } return pre; } };
3、总结:
reverseList函数注释掉的第一部分,是我写的循环方法。reList函数是我写的递归辅助函数。在看了后面别人提供的代码后,又重写了一份。reverseList函数注释掉的第二部分,是递归方法,简洁啊,后面就是循环方法。
A、变量的定义要有一定含义。
B、特殊情况先排除。
C、递归理解:
// head->next->next=head; // head->next=nullptr; ////执行后会被调用函数再次修改,由里到外
在链表尾部,tail->next=head,head->next=nullptr,返回调用函数head->next=head1,head1->neaxt=nullptr。
相关文章推荐
- [C/C++]反转链表
- C#实现基于链表的内存记事本实例
- C#模拟链表数据结构的实例解析
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- C++利用静态成员或类模板构建链表的方法讲解
- C++实现简单的学生管理系统
- Linux内核链表实现过程
- C++链表倒序实现方法
- C#通过链表实现队列的方法
- Node.js环境下JavaScript实现单链表与双链表结构
- C#实现的简单链表类实例
- 找出链表倒数第n个节点元素的二个方法
- Java数据结构之简单链表的定义与实现方法示例
- Java模拟有序链表数据结构的示例
- C语言单循环链表的表示与实现实例详解
- C++实现的链表类实例
- PHP小教程之实现链表
- PHP中模拟链表和链表的基本操作示例
- C语言双向链表的表示与实现实例详解
- js链表操作(实例讲解)