链表面试题

摘要:
即时tmp->5pLinkNodenewNode=NULL;//记录列表之后的第一个节点被翻转6pLinkNodecur=pList->7而(cur)8{9tmp=cur;10cur=cur->12newNode=tmp;=NULL)9{10fast=fast->4pLinkNodedel=NULL;=NULL;

1、逆置链表

假设链表现在是 4->3->2->1->NULL
逆置后的链表是 1->2->3->4->NULL
步骤:
第一步:先把4用临时指针tmp保存起来,cur指向下一个节点,即cur指向3

链表面试题第1张

第二步:令tmp指向newNode,4是第一个节点,则4的next为NULL,即令tmp->next =newNode(最开始newNode为NULL)

第三步:令 newNode= tmp

链表面试题第2张

以此类推,当cur为NULL时,结束循环。

最后更新头指针,将newNode赋给pHead。

链表面试题第3张

完整代码:

 1 void Reverse_list(pLinkList pList)
 2 {
 3     assert(pList);
 4     pLinkNode tmp = NULL;
 5     pLinkNode newNode = NULL; //记录链表翻转后的第一个节点
 6     pLinkNode cur = pList->phead;
 7     while (cur)
 8     {
 9         tmp = cur;
10         cur = cur->next;
11         tmp->next = newNode;
12         newNode = tmp;
13     }
14     pList->phead = newNode; //更新头结点

2.查找链表中间节点 (只允许遍历一次链表)

  快慢指针法:

  快指针每次走两步,慢指针每次走一步,等到快指针走到链表尾部时,慢指针刚好走到链表中间

 1 pLinkNode FindMidNode(pLinkList pList)//查找链表的中间节点
 2 {
 3     assert(pList);
 4     pLinkNode fast = pList->phead; //快指针,一次走两步
 5     pLinkNode slow = pList->phead;  //慢指针,一次走一步
 6     while(fast!=NULL)   
 7     {
 8         if (fast->next != NULL)
 9         {
10             fast = fast->next->next;
11         }
12         else
13         {
14             break;
15         slow = slow->next;
16     }
17     return slow;
18 }

3.删除链表倒数第k个节点,k大0,小于链表长度

    首先给个front指针和back指针,最开始都让他们指向头结点,先让front指针移动K次,然后让front指针和back指针同时移动,
一直到front指针指向为NULL,此时back指针指向的就是倒数第K个节点,
然后我们就可以删除back节点

 1 oid DelKNode(pLinkList pList, int k) //删除链表倒数第k个节点,k必须小于链表长度,k>0
 2 {
 3     assert(pList);
 4     pLinkNode del= NULL;
 5     
 6     if (k == 1)
 7     {
 8         PopBack(pList);
 9     }
10     pLinkNode front= pList->phead;
11     pLinkNode back = pList->phead;
12     while (front != NULL&&k>0)
13     {
14         front = front->next;
15         k--;
16     }
17     while (front != NULL)
18     {
19         front = front->next;
20         back = back->next;
21     }
22     
23         DataType  tmp = back->data;
24         back->data = back->next->data;
25         back->next->data = tmp;
26         del = back->next;
27         back->next = back->next->next;    
28         free(del);
29     
30 
31 
32 }

免责声明:文章转载自《链表面试题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇idea的一些快捷方式Android中应用JavaMail进行邮件发送(工具类)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C# Excel导出超出65536行报错 Invalid row number (65536) outside allowable range (0..65535)

  C# Excel导出超出65536行报错 Invalid row number (65536) outside allowable range (0..65535) 一:报错 Invalid row number (65536) outside allowable range (0..65535) 原因:excel 03的限制就是65536行,超过行数...

C++之迭代器

迭代器的概念 迭代器是用来访问string对象或vector对象的元素的,类似于下标运算和指针。 其对象是容器中的元素或string对象中的字符; 使用迭代器可以访问某个元素,迭代器也能从一个元素移动到另外一个元素。 迭代器的使用 不同于指针,获取迭代器不是使用取地址符,有迭代器的类型同时拥有返回迭代器的成员; 比如,这些类型拥有名为begin和end的成...

html基础:基本标签

一、html简介 html是一个长的字符串,它能够被浏览器解析。html分为三块:html代码,css,js。 html的注释可以用<!-- --> 或者ctrl+? html页面打开以后,右键-检查--直接点击刷新不会清除缓存。如果想要清楚缓存,在检查页面打开的前提下,在浏览器刷新按钮上右键--清除缓存并硬性重新加载 即可 二、标签 标签分为...

1.MyBatis所需要的配置文件

一、Mybatis介绍      MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库...

openshift 3.11 安装部署

openshift 3.11 安装部署 openshift安装部署 1 环境准备(所有节点) openshift 版本 v3.11 1.1 机器环境 ip cpu mem hostname OSsystem 192.168.1.130 4 16 master  CentOS7.6 192.168...

element-ui switch组件源码分析整理笔记(二)

源码如下: <template> <div :class="{ 'is-disabled': switchDisabled, 'is-checked': checked }" role="switch" :aria-checked="checked" :aria-disabled="swit...