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

来源:互联网 发布:帝国cms视频 模版 编辑:程序博客网 时间:2024/06/06 01:10

一、结构体定义:

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;    }}
原创粉丝点击