电话:0731-83595998
导航

2015年软件水平考试程序员精选题(9)

来源: 2017-10-20 12:38

   -反转链表

  题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。链表结点定义如下:

  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;

  }

  扩展:本题也可以递归实现。

编辑推荐:

下载Word文档

温馨提示:因考试政策、内容不断变化与调整,长理培训网站提供的以上信息仅供参考,如有异议,请考生以权威部门公布的内容为准! (责任编辑:长理培训)

网络课程 新人注册送三重礼

已有 22658 名学员学习以下课程通过考试

网友评论(共0条评论)

请自觉遵守互联网相关政策法规,评论内容只代表网友观点!

最新评论

点击加载更多评论>>

精品课程

更多
10781人学习

免费试听更多

相关推荐
图书更多+
  • 电网书籍
  • 财会书籍
  • 其它工学书籍
拼团课程更多+
  • 电气拼团课程
  • 财会拼团课程
  • 其它工学拼团
热门排行

长理培训客户端 资讯,试题,视频一手掌握

去 App Store 免费下载 iOS 客户端