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

Posted xulu_258

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查找链表中倒数第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>


以上是关于查找链表中倒数第k个结点的主要内容,如果未能解决你的问题,请参考以下文章

代码的鲁棒性:链表中倒数第k个结点

剑指offer十四之链表中倒数第k个结点

剑指offer:面试题15链表中倒数第 K 个结点

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

14 链表中倒数第K个节点 FindKthToTail

二种方法查找链表倒数第K个结点