问题描述:
在不涉及统计链表结点数的情况下,找出单链表倒数第n个结点。当然n的值绝不会超过链表长度。
算法思想:
初始化两个结点指针,ppre和pcur,并且都指向头指针。用一个循环将结点指针pcur向后偏移n-1个结点位置。此时ppre指向链表的第一个结点的位置,pcur指向链表第n个结点的位置。再用一个循环控制ppre和pcur两个指针的偏移。ppre向后偏移一个结点位置,同时pcur也向后偏移一个结点的位置。当pcur指向尾结点时,此时ppre就指向链表倒数第n个结点的位置。两个指针运动轨迹逻辑图如下:
案例运行效果:
完整代码如下:
#include<stdio.h>
#include<stdlib.h>
#define N 4
typedef struct linklist {
int data;
struct linklist *next;
}list,*plist;
void list_create(plist *pphead, plist*pptail, int key) //创建链表
{
plist pnew = (plist)calloc(1, sizeof(list));
pnew->data = key;
if (NULL == (*pphead))
{
*pphead = pnew;
*pptail = pnew;
}
else {
(*pptail)->next = pnew;
*pptail = pnew;
}
}
void search_node(plist phead, plist ptail)
{
plist ppre=phead, pcur = phead;
int count = N-1;
while (count > 0)
{
pcur = pcur->next;
count--;
}
while (pcur->next)
{
ppre = ppre->next;
pcur = pcur->next;
}
printf("链表倒数第%d个结点为%d\n",N, ppre->data);
}
int main()
{
plist phead = NULL, ptail = NULL;
int key;
while (scanf("%d", &key) != EOF)
{
list_create(&phead, &ptail, key);
}
search_node(phead, ptail);
system("pause");
}