反转链表
来源:互联网 发布:电路模拟软件中文版 编辑:程序博客网 时间:2024/05/17 20:13
第一个想到的还是栈,毕竟翻转这种事情。。
class Solution {public: ListNode* ReverseList(ListNode* pHead) { if(!pHead) return NULL; stack<ListNode*> s; while(pHead) { s.push(pHead); pHead = pHead->next; } ListNode* root = s.top(); //新头 ListNode* p = root; //辅助 while(!s.empty()) { p->next = s.top(); p = p->next; s.pop(); } p->next = NULL; return root; }};
第二种是链表的前插法,取原链表的每一个节点,前插到新的链表上。
class Solution {public: ListNode* ReverseList(ListNode* pHead) { if(!pHead) return NULL; ListNode* root = pHead; pHead = pHead->next; root->next = NULL; while(pHead) { ListNode* next_node = pHead->next; //保存下一个节点 pHead->next = root; root = pHead; //新头是新插入的节点 pHead = next_node; } return root; }};
第三种是三个指针在链表上滑动,把每个节点指向前一个节点(如果为空则指向NULL)
class Solution {public: ListNode* ReverseList(ListNode* pHead) { ListNode* pre = NULL; ListNode* after = NULL; while(pHead) { after = pHead->next;//保存下个节点 pHead->next = pre; pre = pHead; pHead = after; } return pre; }};
还有第四种,递归。
class Solution {public: ListNode* reverseList(ListNode* head) { if(!head || !head->next) return head; ListNode* newhead = reverseList(head->next); head->next->next = head; //1 head->next = NULL; //2 return newhead; }};
上边的1、2可以这样理解:
反转链表的最底结构可以为两个节点,
阅读全文
0 0
- 链表反转
- 反转链表
- 单向链表反转
- 链表反转:
- 链表的反转
- 链表反转
- 反转单向链表
- 链表反转
- 单向链表反转
- 单向链表反转
- 链表的反转
- 链表反转
- 反转链表
- 链表反转
- 链表反转
- 链表反转
- 链表反转
- 链表的反转
- 神经元
- 前端遇坑记录(一)
- 【mysql】数据库导出和导入
- TOMCAT为多个web应用启动多个端口
- 用setTimeout()方法来模拟setInterval()与setInterval()之间的什么区别?
- 反转链表
- Hibernate基础
- 使用python程序从youtube批量下载视频
- 用Path来绘制一些图形
- 可复用的UITableViewHeaderFooterView自动布局代码应该写在哪
- 定制 UnityAppController
- mysql
- IOS OpenSSL项目添加
- 7218:献给阿尔吉侬的花束( 2.5基本算法之搜索)