《剑指offer》面试题15——链表中倒数第k个结点

输入一个链表,输出该链表中倒数第k个结点。

#include<iostream>
#include<vector>
#include<windows.h>

using namespace std;

struct ListNode {
    int val;
    ListNode *next;
};

ListNode* FindKthToTail ( ListNode* pListHead, unsigned int k )
{
    if( pListHead==NULL|| k==0 )
        return NULL;

    ListNode *pAhead = pListHead;
    ListNode *pBehind = NULL;
    for(unsigned int i=0;i<k-1;i++)
    {
        if(pAhead->next!=NULL)
            pAhead=pAhead->next;
        else
            return NULL;
    }
    pBehind=pListHead;
    while(pAhead->next!=NULL)
    {
         pAhead=pAhead->next;
         pBehind=pBehind->next;
    }
    return pBehind;
}

void MYPrint(ListNode *p)   //打印链表
{
    while(p!=NULL)
    {
        cout<<p->val<<" ";

        p=p->next;
    }
    cout<<endl<<endl;
    return;
}


int main()
{

    int myarray[]={1,2,3,4,5,6,7};
        int num=sizeof(myarray)/sizeof(int);
        //将数组myarray中的内容传递给链表

        //链表
        ListNode *head,*p,*lins;  //首先建立一个头指针head指向链表的最开始。。当链表还没有建立的时候头指针为空。
        head=NULL;    //头指针初始为空

        for(int i=0;i<=num-1;i++)
        {
            //建立一个结点,并用临时指针p指向这个结点。
            p = new ListNode ;
            p->val = myarray[i];   //将数据存储到当前结点的data域中
            p->next = NULL;    //设置当前结点的后继指针指向空,也就是当前结点的下一个结点为空。

            if(head==NULL)
            {
                head=p;   //如果这是第一个创建的结点,则将头指针指向这个结点
            }
            else
            {
                lins->next=p; //如果这不是第一个创建的结点,则将上一个结点的后继指针指向当前结点
            }
            lins=p;  //指针lins也指向当前结点.
        }

    cout<<"链表内容为:"<<endl;
    MYPrint(head);


    cout<<"倒数第k个结点为:";
    cout<<FindKthToTail(head,3 )<<endl;

    system("pause");
    return 0;
}

输出结果为:

链表内容为:
1 2 3 4 5 6 7

倒数第k个结点为:0xc31250
请按任意键继续. . .

猜你喜欢

转载自blog.csdn.net/zhenaoxi1077/article/details/80375986