1.求链表中的倒数第K个结点
思路一:假设整个链表有n个结点,那么倒数第K个结点就是从头结点开始的第n-k+1个结点。如果我们能够得到链表中的结点个数为n,那只要从头结点开始往后走n-k+1步就可 以了。如何得到结点数n?这个不难,从头开始遍历链表每经过一个结点,结点个数增1即可。也就是说我们需要遍历链表两次,第一次统计出链表中结点的个数,第 二次就能找到链表的第k个结点,效率低些,但是面试可能要求只能遍历一次链表来完成题目
思路二:为了实现只遍历链表1次就能找到倒数第k个结点,我们可以定义两个指针pahead和pbehind,开始时,两指针都指向链表第一个结点。第一个指针pahead从链表的 头指针开始遍历向前走k-1,指向第K个结点,第二个指针pbehind保持不动;从k步开始,pbehind指针也开始从链表的头部开始遍历,同时,pahead从第k个结点, 由于两 个指针始终保持k-1个距离,因此当pahead指向链表最后一个结点时,pbehind指向链表的倒数第k个结点。
代码:
//求链表中的倒数第K个结点
Node * FindKth2Tail(node **phead,int k)
{
if(*phead==NULL || k==0)//边界条件测试1:
return NULL;
Node *pAhead=*phead;
Node *pBehind=*phead;
for(int i=0;i<k-1;i++)//
{
if(pAhead->next != NULL)//边界条件测试2:链表中结点数是否小于k
pAhead=pAhead->next;
else
return NULL;//若小于直接退出
}
while(pAhead->next!=NULL)
{
pAhead=pAhead->next;
pBehind=pBehind->next;
}
return pBehind;
}
2.扩展:求链表的中间结点,如果链表的结点总数为奇数,返回中间结点,若为偶数,返回中间两个结点的任何一个。
思路:为了解决这一问题,同样可以设置两个指针,同时从链表的头结点出发,一个指针一次走一步,另一个指针一次走两步。当走得快的指针指向链表的尾端时,走得慢的 指针正好指向链表的中间结点
代码:
//求链表中的中间结点:当结点总数为奇数时,中间结点即为中间的结点;当结点总数为偶数时,中间结点为中间的两个结点的任意一个,
//是不是还得在这里用随机数算法从这两个结点中取随机数
Node *FindMidNode(node ** phead)
{
if(*phead==NULL )//边界条件测试1:
return NULL;
Node *pAfast=*phead;
Node *pAslow=*phead;
//while(pAfast->next!=NULL)//此时当结点总数为偶数时,返回的中间两个结点中的右边的那一个结点;
//{
// pAslow=pAslow->next;
// pAfast=pAfast->next->next;
// if(pAfast==NULL)
// break;
//}
//return pAslow;
while(pAfast->next!=NULL &&pAfast->next->next!=NULL)
{
pAslow=pAslow->next;
pAfast=pAfast->next->next;
}
return pAslow;//此时当结点总数为偶数时,返回的中间两个结点中的左边的那一个结点;
}
当我们用一个指针遍历链表不能解决问题的时候,可以尝试用两个指针来遍历链表。可以让一个指针遍历的速度快一些(比如在一次走两步);或者让它现在链表上走若干步,然后再让另一个指针开始走
分享到:
相关推荐
然后先让第一个指针first走k-1步,然后两个指针再一起走,当第二个指针second走到末尾(second.next = null)时,第一个指针first就
剑指Offer(Python多种思路实现):链表中倒数第k个节点 面试22题: 题目:链表中倒数第k个节点 题:输入一个链表,输出该链表中倒数第k个结点。 解题思路一:为了实现只遍历链表一次就能找到倒数第k个节点,我们可以...
# Python实现《剑指offer》 部分代码自己添加了一些测试用例, 或者自己添加了一些功能 1. 初级程序员注重算法和数据结构 2. 事先做好准备,对工作有热情 3. 面试过程放松。不要急于写代码,了解清楚所要解决的问题,...
【Python学习-链表】【剑指offer】之链表中倒数第k个结点、反转链表、合并排序链表题目分析代码反转链表分析代码合并排序链表分析代码 题目 输入一个链表,输出该链表中倒数第k个结点。 分析 方法一:先计数,在查询...
题目地址:链表中倒数第k个结点 题目描述 输入一个链表,输出该链表中倒数第k个结点。 节点结构如下: public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } ...
链表中倒数第k个结点(python) 题目 输入一个链表,输出该链表中倒数第k个结点。 思路 用两个指针,指针p、q最开始都指向 head,p 先向右移动 k 位,然后 p 和 q 再一起同步向右移动,当 p 到达边界时(p指向空),...
面试题15 链表中倒数第k个结点 面试题16 反转链表 面试题17 合并两个排序的链表 面试题18 树的子结构 第4章 解决面试题思路 4.2 画图让抽象问题形象化 面试题19 二叉树的镜像 面试题20 顺时针打印矩阵 4.3 举例让...
使用「快慢指针/双指针」可以很容易处理:「找出链表中环的入口结点」、「删除倒数第 K 个结点」等问题。 而树的「前序遍历」、「中序遍历」、「后序遍历」都有不同的特点,前序遍历和中序遍历的结合可以帮我们解决...
链表中倒数第k个结点 代码的鲁棒性 15 反转链表 代码的鲁棒性 LeetCode 206 16 合并两个排序的链表 代码的鲁棒性 17 树的子结构 代码的鲁棒性 18 二叉树的镜像 面试思路 19 顺时针打印矩阵 画图让抽象形象化 ...
Interviews(剑指offer Java代码)二维数组中的查找替换空格从尾到头打印链表重建二叉树用两个栈实现队列旋转数组的最小数字斐波那契数列跳台阶变态跳台阶矩形覆盖二进制中1的个数数值的整数次方调整数组顺序使奇数...
快慢指针,比如,返回一个链表的中间节点,倒数第k个节点,有环结点,向右旋转的链表这些题目。 通常要分别选取列表长度为奇数、偶数的测试用例,以验证算法在一般情况下正确性。 使用链表 Queue queue=new ...
15链表中倒数第k个结点 16反转链表 17合并两个排序的链表 18树的子结构 19二叉树的镜像 20顺时针打印矩阵 21包含min函数的栈 22栈的压入弹出序列 23从上往下打印二叉树 24二叉搜索树的后序遍历序列 25二叉树中和为某...
leetcode和剑指 Algorithm ...14.单链表:链表中倒数第k个结点 15.单链表:反转链表 16.单链表:合并两个排序的链表 17.二叉树:树的子结构 18.二叉树:二叉树的镜像 19.顺时针打印矩阵 20.栈:包含min函数的栈
判断青蛙过河leetcode ads_java Algorithms and Data Structures 参考资料 《数据结构与算法经典问题解析-Java语言描述 第二版》 《数据结构与算法分析-Java语言描述 第二版》 ...链表中倒数第k个结点 反转
5、删除链表倒数第 n 个结点 6、求单向链表的中间结点 二、栈 1、Java实现顺序栈、链式栈 三、队列 1、顺序队列、链式队列 2、循环队列 四、排序算法 1、冒泡排序 2、插入排序 3、选择排序 4、归并排序 5、快速排序 ...
leetcode 苹果 OnlineJudge Code for ...链表中倒数第k个结点 中 代码的鲁棒性 反转链表 中 代码的鲁棒性 合并两个排序的链表 难 代码的完整性 数值的整数次方 中 举例让抽象具体化 栈的压入、弹出序
14.链表中倒数第k个结点 题目: 答案: 16.合并两个排序的链表 题目: 答案: 18.二叉树的镜像 题目: 答案: 36.两个链表的第一个公共结点 题目: 答案: 38.二叉树的深度 题目: 答案: 39.平衡二叉树 题目: 答案...