单链表中求倒数第几个节点

来源:互联网 发布:js 判断event 编辑:程序博客网 时间:2024/06/04 08:34

问题描述

在单链表中求出倒数第K个节点,要求快速。

方法一:利用链表的长度(不推荐)

此方法必须事先知道链表的长度,在有长度的信息链表中,此方法可行。
比如我之前的链表是这样的实现,参考博文:http://blog.csdn.net/dawn_after_dark/article/details/73610674此链表含有头节点,头节点含有长度信息,所以我们可以充分运用长度信息。先让指针指向第一个节点,然后head->value(链表的长度)-k,即可求出要走到倒数第K个需要走几步。

Node* findKthNode(int); //返回倒数第K个

实现

Node* LinkList::findKthNode(int k) {    Node* first = head->next;    if (k <= 0 || k > head->value) {        cout << "输入索引非法,请输入合理索引!" << endl;        return NULL;    }    int pace = head->value - k;    for (int i = 1;i <= pace;i++) { //第一个指针先走K步        first = first->next;    }    return first;}

方法二:利用2个指针(推荐)

此方法只需2个指针即可,非常快,还容易理解。比如在操场上跑100米,小明跟小王赛跑,小王先跑20米,之后小明再跑,假设2人的速度一致,所以当小王到达终点时,小明正好在倒数20米处。所以,我们可以先让2个指针都先指向第一个节点,然后移动其中一个指针k步,之后让2个指针同步移动,直到第一个指针指向NULL,这时第二个指针就位于倒数第K个。
类的声明参考上面我给的博文,添加findKthNode函数。

Node* findKthNode(int); //返回倒数第K个

实现

Node* LinkList::findKthNode(int k) {    Node* first = head->next;    Node* second = head->next;    if (k <= 0 || k > head->value) {        cout << "输入索引非法,请输入合理索引!" << endl;        return NULL;    }    for (int i = 1;i <= k;i++) { //第一个指针先走K步        first = first->next;    }    while (first) {    //当第一个指针走完时,第二个指针正好指在倒数第K个        first = first->next;        second = second->next;    }    return second;}