链表中倒数第k个结点


题目:输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值一次是1,2,3,4,5,6.这个链表的倒数第3个结点是值为4的结点。


链表结点定义如下:

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

程序代码如下:

#include <iostream>

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

void CreateList(ListNode*& pHead, int *arr, int len)
{
    pHead = (ListNode *)malloc(sizeof(ListNode));
    pHead->pNext = NULL;
    if (arr == NULL || len <= 0)
    {
        pHead = NULL;
        return;
    }
    ListNode *pNext = pHead, *s;
    for (int i = 0; i < len; i++)
    {
        s = (ListNode*)malloc(sizeof(ListNode));
        s->iValue = arr[i];
        pNext->pNext = s;
        pNext = pNext->pNext;
    }
    pNext->pNext = NULL;
    pHead = pHead->pNext;
}

ListNode* FindKthNodeToTail(ListNode* pHead, int k)
{
    if (pHead == NULL || k <= 0)
    {
        return NULL;
    }
    ListNode* pToTail = pHead, *pToKthToTail = pHead;
    while (pToTail && k)
    {
        pToTail = pToTail->pNext;
        k--;
    }
    if (k)
    {
        return NULL;
    }
    while (pToTail)
    {
        pToTail = pToTail->pNext;
        pToKthToTail = pToKthToTail->pNext;
    }
    return pToKthToTail;
}

void PrintList(ListNode *pHead)
{
    while (pHead)
    {
        std::cout << pHead->iValue << " ";
        pHead = pHead->pNext;
    }
    std::cout << std::endl;
}

int main()
{
    int arr[] = { 1, 2, 3, 4, 5, 6 ,7, 8 ,9 };
    ListNode *pHead, *pNode;

    CreateList(pHead, arr, 9);
    PrintList(pHead);
    pNode = FindKthNodeToTail(pHead, 8);

    if (pNode)
    {
        std::cout << pNode->iValue << std::endl;
    }

    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值