剑指Offer-15-链表中的倒数第k个节点

题目:输入一个链表,查找该链表中的倒数第k个结点
比如链表为{1,2,3,4},则倒数第2个节点为3。
思路:
使用两个指针,第1个指针先走k-1步,然后,两个指针同时前进,知道第一个指针走到链表末尾。
注意:该题应当注意如果k超过链表长度的情况,增加代码鲁棒性。

#include <iostream>
using namespace std;

struct ListNode {
    int value;
    ListNode *pNext;
};

/**
 *用于查询倒数第K个结点
 */
ListNode* findLastKNode(ListNode *pHead,int k) {
    if(pHead==NULL || k <= 0) {
        return NULL;
    }
    ListNode *pBehind = pHead;
    ListNode *pForwardK = pHead;
    int pos = 0;
    //提前指针先走k-1步
    while(pos<k-1 && pForwardK != NULL) {
        pos++;
        pForwardK = pForwardK->pNext;
    }
    //如果提前指针为空,即代表查询范围超出链表长度
    if(pForwardK == NULL)
        return NULL;
    //提前K步指针与随后指针共同前进
    while(pForwardK->pNext != NULL) {
        pForwardK = pForwardK->pNext;
        pBehind = pBehind->pNext;
    }
    return pBehind;
}

/**
 * 向链表中插入结点
 */
void insertList(ListNode **pHead,ListNode *value) {
        ListNode *head = *pHead;
        if(head == NULL) {
            *pHead = value;
        }
        else {
            while(head->pNext != NULL) {
                head = head->pNext;
            }
            head->pNext = value;
        }
}

/**
 * 向链表中插入结点
 */
void insertList(ListNode **pHead,int value) {
    ListNode *p = new ListNode();
    p->value = value;
    p->pNext = NULL;
    insertList(pHead,p);
}

int main() {
    //构造链表
    ListNode *head = NULL;
    insertList(&head,1);
    insertList(&head,2);
    insertList(&head,3);

    //测试实例
    //1.链表的最后一个结点
    //2.链表的中间结点
    //3.链表的第一个结点
    //4.越界步长
    ListNode *lastK = NULL;

    lastK = findLastKNode(head,1);
    cout<<lastK->value<<endl;
    lastK = findLastKNode(head,2);
    cout<<lastK->value<<endl;
    lastK = findLastKNode(head,3);
    cout<<lastK->value<<endl;
    lastK = findLastKNode(head,4);
    if(lastK == NULL)
        cout<<"NULL"<<endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值