剑指offer:链表倒数第k个节点

来源:互联网 发布:linux oracle 建库 编辑:程序博客网 时间:2024/05/29 19:41

题目:输入一个链表,输出该链表的倒数第k个节点,假设从1开始计算,链表的尾节点是倒数第一个节点。

基本思想:

如果只能遍历一次链表就能得到链表的倒数第k个节点就好了,为了实现这个功能,我们定义两个指针。第一个指针从链表的头指针开始遍历向前走k-1,第二个指针保持不动,从第k步开始,第二个指针也开始从链表的头指针开始遍历,由于两个指针的距离保持k-1,当第一个指针到达链表尾时,第二个指针正好是倒数第k个节点。

我们要额外考虑的三种情况:

1、输入的  list  为空指针,这在代码中要判断

2、输入的  list  中节点个数不超过k,这时得不到倒数dik个节点

3、输入的 k=0或者为负数,这时候也不会出来任何结果


ListNode* FindKthToTail(ListNode *pListHead,int k){    if(pListHead==NULL || k<=0)return NULL;    ListNode *p1=pListHead,*p2=NULL;    int i=0;    for(i=0;i<k-1;++i)    {        if(p1->next!=NULL)            p1=p1->next;        else            return NULL;    }    p2=pListHead;    while(p1->next != NULL)    {        p1=p1->next;        p2=p2->next;    }    return p2;}

上面的程序处理了3中可能出现的异常情况,这是代码健壮性的体现,


PS:

1、求链表的中间节点,如果链表中节点总数为奇数,返回中间节点;总数是偶数,返回中间两个节点的任意一个。我们可以定义两个指针,同时从链表的头结点出发,一个指针一次走一步,一个指针一次走两步,当走得快的指针走到链表的末尾时,走得慢的指针正好在链表的中间。当然这过程中也要考虑一些额外的情况防止出现意外。

2、判断一个单向链表是否形成环形结构。定义两个指针,同时从链表的头节点出发,一个指针一次走一步,一个指针一次走两步,如果走得快的的指针追上了走的慢的指针,那么链表就是环形链表,如果走得快的指针一直追到了链表的末尾都没有赶上走的慢的指针,那么链表就不是环形链表。

0 0
原创粉丝点击