找到单向链表的倒数第k个节点

Posted on 2016-05-31 16:06  洪爵士  阅读(361)  评论(0编辑  收藏  举报
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/*
找到⼀个未知长度单链表的倒数第K个节点。
提示:
head—>1—>2—>3—>4—>5—>6—>7—>8—>9—>10—>NULL
其中倒数第0个节点是NULL,倒数第1个节点是10,倒数第10个节点是1.
*/
//第一种方法:先遍历一遍,然后计算链表的长度
//           然后使用指针跳动
//第二中方法:使用两个指针,第二个指针跳k下,然后和第一个指针一起跳,直到第二个指针指向NULL,
//           第一个指针指的就是倒数第k个节点
typedef struct Node
{
	int data;
	struct Node *next;
}Node;

//从尾部添加节点
void AppendtoEnd(Node *head,int data)
{
	Node *new_node=NULL;
	Node *temp=NULL;

	new_node=malloc(sizeof(Node));
	new_node->data=data;
	new_node->next=NULL;

	//找到最后一个节点
	temp=head;
	for(;temp->next!=NULL;temp=temp->next);
	temp->next=new_node;
}

//打印链表
void ShowList(Node *head)
{
	Node *temp=NULL;
	if(head==NULL)
	{
		return ;
	}
	temp=head->next;
	for(;temp!=NULL;temp=temp->next) 
	{
		printf("%d",temp->data);
		printf("-->");
	}
	printf("\n");
}

//实现找到倒数第k个节点
Node *FindLastk(Node *head, int k)
{
	Node *first=head;
	Node *second=head;
	int i=0;
	//前指针先走k步
	for(i=0;i<k;i++) 
	{
		first=first->next;
	}
	//两个一起走,直到前指针非法
	for(;first!=NULL;first=first->next,second=second->next);
	return second;
}

int main(void)
{
	int i=0;
	int k=10;
	Node *k_node=NULL;
	Node *head=malloc(sizeof(Node));
	head->next=NULL;
	
	for(i=1;i<11;i++) 
	{
		AppendtoEnd(head, i);
	}
	ShowList(head);
	if(k == 0) 
	{
		printf("NULL\n");
	}
	else 
	{
		k_node=FindLastk(head, k);
		printf("倒数第%d个节点是%d\n",k,k_node->data);
	}
	free(head);
	return 0;
}