您的位置:首页 > 职场人生

链表面试题(五)---寻找链表的倒数第k个结点O(N)

2017-05-17 00:01 337 查看
一、结构体定义:

typedef struct ListNode//定义结点
{
DataType data;
struct ListNode* next;
}ListNode,*PListNode;

typedef struct  PList//定义一个成员是指向结点的指针的结构体
{
PListNode PHead;
}PList,*PList;


二、函数实现

思路:定义两个指针a,b,一开始都指向链表的第一个结点,然后让a指针以每次走一个结点的走法,先走k-1步,此时b指针仍然在第一个结点处,这时这两个指针之间相差k-1个结点,然后让两个指针都以每次走一步的走法同时向前走,直到a指针走到尾部,此时b指针所指向的结点,就是链表倒数第k个结点;(个人觉得就是拿了一个k厘米的尺子,从链表的尾部丈量k距离的结点)

PListNode FindKNode(PList PList,int k)
{
PListNode front=NULL;
PListNode back=NULL;
PListNode del=NULL;
int i=0;
assert(PList);
front=PList->PHead;
back=PList->PHead;
if (PList->PHead==NULL||k<=0)//如果是空链表或者k<=0
{
return NULL;
}
else     //如果不是空链表,k>0
{
for(i=1;i<k;i++)   //front先走到k-1步
{
if (front)
{
front=front->next;
}
else//当k的值大于结点个数
{
return NULL;
}
}
while (front->next)
{
front=front->next;
back=back->next;
}
return back;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面试题 链表