LintCode 35: Reverse Linked List

题目描述

翻转一个链表。

样例

给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null

Thu Sep 21 2017

思路

本题的思路很多,今天把之前的方法改进了一下,使用两个指针就可以达到目的了(实际上也用了三个指针,但之前的方法太繁琐了)。

翻转链表的本质是将原本的“箭头”反转,这个操作在只有两个元素的时候很好实现,就一条赋值语句即可。而到了多个元素的时候,只需多考虑一下怎么暂存指针地址,避免链表“断掉”后找不到节点的情况就行了。

代码

// 反转链表
class Solution {
public:
/**
* @param head: The first node of linked list.
* @return: The new head of reversed linked list.
*/
ListNode* reverse(ListNode* head)
{
ListNode* pNewHead;
if (head == NULL || head->next == NULL) return head;
ListNode *p1 = head, *p2 = head->next;
while (p2 != NULL)
{
ListNode* p3 = p2->next;
p2->next = p1;
p1 = p2;
p2 = p3;
}
pNewHead = p1;
head->next = NULL;
return pNewHead;
}
};

Mon Mar 6 2017

思路

这道题的方法就很多了,我这里第一想到的就是用三个指针来实现,可能我以前这么实现过吧。

不过这个方法并不是最优的方法,还可以用两个指针,或者递归实现,这些坑以后再补吧。

代码

// 反转链表
class Solution {
public:
/**
* @param head: The first node of linked list.
* @return: The new head of reversed linked list.
*/
ListNode *reverse(ListNode *head) {
ListNode* ans;
if (head == NULL || head->next == NULL) return head;
else if (head->next->next == NULL)
{
head->next->next = head;
ans = head->next;
head->next = NULL;
return ans;
}
ListNode *p1 = head, *p2, *p3;
while(1)
{
p2 = p1->next;
p1 =
}
}
ListNode *reverse(ListNode *head) {
ListNode* ans;
if (head == NULL || head->next == NULL) return head;
else if (head->next->next == NULL)
{
head->next->next = head;
ans = head->next;
head->next = NULL;
return ans;
}
ListNode* p1 = head, *p2 = NULL, *p3 = NULL;
while(1)
{
if (p1 != NULL && p1->next != NULL && p1->next->next != NULL)
{
p2 = p1->next;
p1->next = p3;
p3 = p2->next;
p2->next = p1;
p1 = p3->next;
p3->next = p2;
continue;
}
else if (p1 != NULL && p1->next != NULL && p1->next->next == NULL)
{
ans = p1->next;
ans->next = p1;
p1->next = p3;
}
else if (p1 != NULL && p1->next == NULL)
{
ans = p1;
ans->next = p3;
}
else
{
ans = p3;
}
break;
}
head->next = NULL;
return ans;
}
};

最新文章

  1. 公司的一个面试题:如何用css让一个容器水平垂直居中?
  2. C#编程总结--总目录
  3. Nodejs与ES6系列2:Promise对象
  4. nginx rewrite 指令last break区别最详细的解释
  5. IOC框架的认识
  6. POJ 2249
  7. 为什么JS动态生成的input标签在后台有时候没法获取到
  8. COJ 1002 WZJ的数据结构(二)(splay模板)
  9. python之路-pip安装
  10. Oracle 快照及 dblink使用 (两台服务器数据同步)
  11. 最简单的视频编码器:基于libx265(编码YUV为H.265)
  12. 【Egret】在WebStorm里使用Egret Engine 的注意点
  13. Apriori算法(C#)
  14. Spring+SpringMVC+MyBatis+easyUI整合进阶篇(一)设计一套好的RESTful API
  15. 【git】idea /git bash命令 操作分支
  16. Confluence 6 配置管理员会话的安全
  17. 洛谷 P3627 [APIO2009]抢掠计划
  18. 【python】json中字典key不可为数值型
  19. Oracle 控制文件管理
  20. 使用DDOS deflate抵御少量DDOS攻击

热门文章

  1. linux虚拟机发邮件给163邮件
  2. 找"数学口袋精灵"bug
  3. Beta阶段冲刺第二天
  4. 爬虫学习之-sqlite3
  5. 常用的Redis客户端的并发模型(转)
  6. ETL技术( Extract-Transform-Load) 数据仓库技术-比如kettle
  7. default.properties文件
  8. 在64位系统上部署BDE的要点
  9. IE8 没有内容的盒子,如果有定位,浮现在其他盒子上 可能会有点击穿透没有作用的情况
  10. windows200364位iis6 php环境搭建