博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
链表反转 58面试“留念”
阅读量:4072 次
发布时间:2019-05-25

本文共 1383 字,大约阅读时间需要 4 分钟。

题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。链表结点定义如下:
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
为空指针的结点。

基于上述分析,我们不难写出如下代码:

///
// Reverse a list iteratively
// Input: pHead - the head of the original list
// 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 at pNext
             ListNode* pNext = pNode->m_pNext;
            // if the next node is null, the currect is the end of original 
            // list, and it's the head of the reversed list
            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;
}

转载地址:http://aieji.baihongyu.com/

你可能感兴趣的文章
概率论:乘法定理、全概率公式以及贝叶斯定理
查看>>
ECSHOP发送邮件显示格林尼治时间问题的解决
查看>>
tensor shape can be flexible to determined in Tensorflow
查看>>
Tensorflow中怎么使用queue读取数据的情况下,在同一个session中边训练边测试
查看>>
使用p6spy打印hibernate或者PreparedStatement的带参数值的sql语句
查看>>
流水账...12321984543
查看>>
Tied weights in Tensorflow
查看>>
spring security对用户名和密码的校验过程
查看>>
spring security对于多登陆页面多用户数据源的使用
查看>>
2017年11月
查看>>
流水账
查看>>
Mac下PDF转EPS的方法
查看>>
php中的一些好东西
查看>>
2018新年开篇
查看>>
comments on the inverse model to solve multi-objective optimization
查看>>
iphone通信录导入到e71中
查看>>
spring security自定义登陆成功后处理
查看>>
Matlab2017b在macos high Sierra下的mex
查看>>
什么是机器智能
查看>>
2018.04.06
查看>>