查找链表中倒数第k个结点
2016-04-24 11:05
309 查看
例如有一个链表一共有6个结点,从头开始他们的值依次是1、2、3、4、5、6,那么这个链表的倒数第三个结点是值为4的结点。
首先看到这个题目,我们也许会想到从链表的尾端开始遍历,回溯K步,可是这个链表是单链表,只有从前向后的指针,没有从后向前的指针,因此这种思路不行,
于是我们又想到链表的倒数第k 个结点就是从头开始的N-k+1个结点,因此只需从头遍历走n-k+1步即可。可是这样的话为哦们需要对链表进行两次遍历,因此最后我们想到可以用两个指针,第一个指针走K-1,然后让第二个指针指向头节点,当第一个指针指向末尾时,第二个指针即指向第k个结点了,具体代码如下:
首先看到这个题目,我们也许会想到从链表的尾端开始遍历,回溯K步,可是这个链表是单链表,只有从前向后的指针,没有从后向前的指针,因此这种思路不行,
于是我们又想到链表的倒数第k 个结点就是从头开始的N-k+1个结点,因此只需从头遍历走n-k+1步即可。可是这样的话为哦们需要对链表进行两次遍历,因此最后我们想到可以用两个指针,第一个指针走K-1,然后让第二个指针指向头节点,当第一个指针指向末尾时,第二个指针即指向第k个结点了,具体代码如下:
<span style="font-size:18px;">/*删除链表中的的倒数第k个结点 1.k==0; 2.空链表 3.k>链表中的结点数 */ #include<stdio.h> #include<malloc.h> typedef struct listnode { int value; struct listnode *next; }listnode,*linklist; //利用头插法建立单链表 linklist creat_linklist() { int x; linklist s; linklist head = (linklist)malloc(sizeof(listnode)); head->next=NULL; scanf("%d",&x); while(x!=-1) { s=(linklist)malloc(sizeof(listnode)); s->value=x; s->next=head->next; head->next=s; scanf("%d",&x); } return head; } //查找链表中的倒数第K个结点 int findk(linklist head,unsigned int k) { unsigned int i; listnode *phead=head; linklist pbehind=NULL; if(head==NULL||k==0) { return 0; } for(i=0;i<k-1;i++) { if(phead->next!=NULL) { phead=phead->next; } else //避免总结点小于K的情况 return 0; } pbehind=head; while(phead->next!=NULL) { phead=phead->next; pbehind=pbehind->next; } return pbehind->value; } int main() { unsigned int k; int a; linklist head; scanf("%d",&k); head=creat_linklist(); a=findk(head,k); printf("%d\n",a); }</span>
相关文章推荐
- (Java实现) HDOJ 2058 The sum problem 高斯求和
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- Map获取键值,Map的几种遍历方法
- redis -key的定义规则
- Objective-c 动画
- POJ1815 Friendship
- 轮播图
- 创业未必给职业生涯加分
- java基础(21)--序列化简单例子
- ECMAScript基础小结
- Java方法区和运行时常量池溢出问题分析
- Python学习笔记09
- ElementTraversal API的元素遍历
- 华为OJ之称砝码
- HDU5666-Segment
- php中die(),exit(),return的区别比较
- c# abstract抽象类与继承类子类的构造函数_base
- 简单谈谈如何利用h5实现音频的播放
- Android中的Intent对象完全解析
- hdu3487Play with Chain【splay】