程序员面试宝典(19)-反转链表
来源:互联网 发布:蜂窝数据栏下找不到app 编辑:程序博客网 时间:2024/05/17 09:34
题目
输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。链表结点定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
分析
为了正确地反转一个链表,需要调整指针的指向。与指针操作相关代码总是容易出错的,因此最好在动手写程序之前作全面的分析。
为了将调整指针这个复杂的过程分析清楚,我们可以借助图形来直观地分析。假设下图中l、m和n是三个相邻的结点:
aßbß…ßl mànà…
假设经过若干操作,我们已经把结点l之前的指针调整完毕,这些结点的m_pNext指针都指向前面一个结点。现在我们遍历到结点m。当然,我们需要把调整结点的m_pNext指针让它指向结点l。但注意一旦调整了指针的指向,链表就断开了,如下图所示:
aßbß…lßm nà…
因为已经没有指针指向结点n,我们没有办法再遍历到结点n了。因此为了避免链表断开,我们需要在调整m的m_pNext之前要把n保存下来。
接下来我们试着找到反转后链表的头结点。不难分析出反转后链表的头结点是原始链表的尾位结点。什么结点是尾结点?就是m_pNext为空指针的结点。
基于上述分析,我们不难写出如下代码(JAVA版本):
/** * 反转链表 * @param pHead 头结点 * @return */ public ListNode reverseList(ListNode pHead) { ListNode reverseHead = null; ListNode pNode = pHead; ListNode prev = null; while(pNode!=null){ //得到下一个结点,并保存它 ListNode pNext = pNode.m_pNext; //如果下一个结点为null,则当前结点就是原始链表的尾结点 if(pNext==null) reverseHead = pNode; //反转链表结点 pNode.m_pNext = prev; prev = pNode; pNode = pNext; } return reverseHead; }
0 0
- 程序员面试宝典(19)-反转链表
- [程序员面试金典]-链表反转
- 【程序员面试宝典】数据结构基础三循环链表
- 程序员面试宝典(31)-从尾到头输出链表
- 【程序员面试宝典】链表相关面试题
- [C/C++程序员面试宝典] 程序员面试宝典(33)-在O(1)时间删除链表结点
- 简历注意事项-程序员面试宝典
- 36.c/c++程序员面试宝典-表
- 程序员面试宝典
- 程序员面试宝典A
- Java程序员面试宝典
- Java程序员面试宝典
- java程序员面试宝典
- JAVA程序员面试宝典
- Java程序员面试宝典
- 程序员面试宝典
- 《程序员面试宝典》摘记
- 程序员面试宝典
- MATLAB2015分布式计算服务系统安装与应用
- Tomcat 配置多个服务 server 起多个应用
- Ubuntu14.10搭建LAMP平台以及虚拟主机的设置
- Java高级篇整理
- POJ 2699 - The Maximum Number of Strong Kings(网络流‘最大流)
- 程序员面试宝典(19)-反转链表
- web.xml配置详解
- Tomcat 连接池
- SQL on HBase -- phoenix 之分页查询
- Mac OS X中MacPorts安装和使用
- app文件组成
- Android 绑定类型服务---绑定服务
- Java BlockingQueue
- hibernate工作原理