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

题目:输入一个链表,输出该链表的倒数第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、判断一个单向链表是否形成环形结构。定义两个指针,同时从链表的头节点出发,一个指针一次走一步,一个指针一次走两步,如果走得快的的指针追上了走的慢的指针,那么链表就是环形链表,如果走得快的指针一直追到了链表的末尾都没有赶上走的慢的指针,那么链表就不是环形链表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值