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

struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};

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

第一种方法:定义两个结点指针p1,p2指向该链表的头结点,然后利用p1遍历整个链表,记下长度n;然后再利用p2往后遍历n-k个结点即可,因为p2已经指向了头结点。

  
 ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
    ListNode *ptr = pListHead;//遍历指针
    ListNode *ptr1 = pListHead;//返回指针
    if (pListHead == NULL || k == 0)
        return NULL;
    int n = 1;//已经指向第一个结点
    while (ptr->next != NULL){
        ptr=ptr->next;
        n++;
    }
    if(n<k)
        return NULL;
    for (int i = 0; i < n - k; ++i)
        ptr1 = ptr1->next;
    return ptr1;
    }
 
第二种方法:定义两个结点指针p1,p2指向该链表的头部,然后p1先遍历k-1个结点,然后p1和p2同时遍历。返回p2.
  
 ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
    ListNode *p1 = pListHead;
    ListNode *p2 = pListHead;
    if (pListHead == NULL || k == 0)
        return NULL;
    for (int i = 0; i < k - 1; ++i){
        if (p1->next != NULL)
            p1 = p1->next;
        else
            return NULL;  //还没到第k个就到尾了,及K>链表长度。
    }
    while (p1->next != NULL){
        p1=p1->next;
        p2 = p2->next;
    }
    return p2;
 
两个程序在网上都编译通过
总结:当链表比较小时,第一种方法是很有效的,但是链表比较大时,就有点浪费了,而第二种方法都合适,故可以多多考虑第二种方法
原文地址:https://www.cnblogs.com/jlxuexijidi-2015/p/4887552.html