fightFor复试-day0308-单链表查找倒数第k个节点-快慢指针

原题链接http://www.acmerblog.com/interview-10-2438.html

题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。链表结点定义如下:

struct ListNode
{
      int       m_nKey;
      ListNode* m_pNext;
};

和这道题相似的有:输入一个单向链表。如果该链表的结点数为奇数,输出中间的结点;如果链表结点数为偶数,输出中间两个结点前面的一个。

思路:也是用快慢指针,一个每次移动一个,而另一个每次移动两个。快指针到头,那么慢指针所指就是所求。

另外:使用指针之前判断是不是空指针-编程细节-好的习惯

#include<cstdio>
#include<cstdlib>
#include<fstream>
#include<iostream>
using namespace std;

#define SIZE 400

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

int KfromLast(ListNode* head,int k){
    if(head==NULL)
        return -1;

    ListNode* slow = head;
    ListNode* fast = head;
    int t=k;
    while(t--){
        fast=fast->next;
    }
    while(fast->next!=NULL){
        fast = fast->next;
        slow = slow->next;
    }
    return slow->val;
}

int main()
{
    ifstream cin("cin.txt");
    int n,t;
    while(cin>>n){

        ListNode* tail=NULL;
        ListNode* head=NULL;

        for(int i=0; i<n; i++){
            //ListNode* tmp = (ListNode*)malloc(sizeof(ListNode));
            ListNode* tmp = new ListNode;
            cin>>t;
            tmp->val = t;
            tmp->next = NULL;

            if(head==NULL){
                head=tmp;
                tail=head;
                //cout<<"now the head == NULL"<<endl;
            }
            else{
                //cout<<"now the head is not NULL"<<endl;
                tail->next=tmp;
                tail=tail->next;
            }
        }
        tail = head;
        while(tail!=NULL){
            cout<<tail->val<<" ";
            tail=tail->next;
        }
        cout<<endl;
        cout<<KfromLast(head,n-1)<<endl;
    }

    return 0;
}

  

posted @ 2017-03-08 16:21  _SunDaSheng  阅读(246)  评论(0编辑  收藏  举报