查找链表中倒数第k个结点

例如有一个链表一共有6个结点,从头开始他们的值依次是1、2、3、4、5、6,那么这个链表的倒数第三个结点是值为4的结点。

首先看到这个题目,我们也许会想到从链表的尾端开始遍历,回溯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>


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值