链表反转 58面试“留念”
来源:互联网 发布:淘宝商品点击率 编辑:程序博客网 时间:2024/05/21 19:39
题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。链表结点定义如下:
structListNode
{
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为空指针的结点。
基于上述分析,我们不难写出如下代码:
///////////////////////////////////////////////////////////////////////
//Reverse a list iteratively
//Input: pHead - the head of the originallist
//Output: the head of the reversed head
///////////////////////////////////////////////////////////////////////
ListNode*ReverseIteratively(ListNode* pHead)
{
ListNode* pReversedHead = NULL;
ListNode* pNode = pHead;
ListNode* pPrev = NULL;
while(pNode!= NULL)
{
//get the next node, and save it atpNext
ListNode* pNext = pNode->m_pNext;
//if the next node is null, the currect is the end oforiginal
//list, and it's the head of the reversedlist
if(pNext== NULL)
pReversedHead = pNode;
//reverse the linkage between nodes
pNode->m_pNext = pPrev;
//move forward on the the list
pPrev = pNode;
pNode = pNext;
}
return pReversedHead;
}
struct
分析:这是一道广为流传的微软面试题。由于这道题能够很好的反应出程序员思维是否严密,在微软之后已经有很多公司在面试时采用了这道题。
为了正确地反转一个链表,需要调整指针的指向。与指针操作相关代码总是容易出错的,因此最好在动手写程序之前作全面的分析。在面试的时候不急于动手而是一开始做仔细的分析和设计,将会给面试官留下很好的印象,因为在实际的软件开发中,设计的时间总是比写代码的时间长。与其很快地写出一段漏洞百出的代码,远不如用较多的时间写出一段健壮的代码。
为了将调整指针这个复杂的过程分析清楚,我们可以借助图形来直观地分析。假设下图中l、m和n是三个相邻的结点:
aßbß…ßl
假设经过若干操作,我们已经把结点l之前的指针调整完毕,这些结点的m_pNext指针都指向前面一个结点。现在我们遍历到结点m。当然,我们需要把调整结点的m_pNext指针让它指向结点l。但注意一旦调整了指针的指向,链表就断开了,如下图所示:
aßbß…lßm
因为已经没有指针指向结点n,我们没有办法再遍历到结点n了。因此为了避免链表断开,我们需要在调整m的m_pNext之前要把n保存下来。
接下来我们试着找到反转后链表的头结点。不难分析出反转后链表的头结点是原始链表的尾位结点。什么结点是尾结点?就是m_pNext为空指针的结点。
基于上述分析,我们不难写出如下代码:
///////////////////////////////////////////////////////////////////////
//Reverse a list iteratively
//Input: pHead - the head of the originallist
//Output: the head of the reversed head
///////////////////////////////////////////////////////////////////////
ListNode*ReverseIteratively(ListNode* pHead)
{
0 0
- 链表反转 58面试“留念”
- 单链表反转 -面试
- 面试16: 反转链表
- 人生第一次面试留念
- [面试] [反转链表] 三变量提头法
- 面试算法(十五)反转链表
- 链表相关面试题目 反转 合并
- 面试100题---1反转链表
- 【WG面试算法】链表反转
- 面试常见算法之---反转链表
- 剑指offer面试16 反转链表
- [程序员面试金典]-链表反转
- 【我要去面试】单向链表反转
- 程序员面试宝典(19)-反转链表
- 面试中常见链表问题12:单链表反转(递归)
- 剑指offer-3-面试16:反转链表
- 面试 考虑链表反转的递归实现
- 留念
- 双层状态栏问题 跟踪状态栏Fr…
- CGRectInset、CGRectOffset…
- 总结Objective-C中CGGeometry几何…
- CPM,CPC,CPL,CPS广告术语大全
- test_return LotteryClient
- 链表反转 58面试“留念”
- 我的博客今天0岁200天了,我领取了…
- layoutSubviews 和 layoutIf…
- 关于request.getRealPath(…
- 《转》搞定学习《unix环境高级编程…
- 对应iPhone5 长屏幕的方法 我找到…
- 突然发现,MarsEdit可以离线…
- 后台拿到Json前台Jquery转换为JS object
- test MarsEdit