单链表中求中间节点

问题描述

求单链表中间节点的值,如果中间有2个,只要第一个,就是偶数情况下,只要中间的第一个。速度要快!
这里写图片描述

解决方法

可以参照这篇博文:http://blog.csdn.net/dawn_after_dark/article/details/73611115
这篇博文所说的第一种方法这里就不阐述了。着重说一下第二种。
这里还是用小明和小王跑步的例子,小明与小王一起跑步,小王的速度是小明的2倍,当小王跑到终点的时候,小明正好处于正中间。所以我们这里还是用2个指针,一个指向第一个节点以1步向前走,另一个指向第二个节点以2步向前走。
Linklist完整定义参考博文:http://blog.csdn.net/dawn_after_dark/article/details/73610674
类中添加函数声明:

Node* findHalfNode();

函数实现:

Node* LinkList::findHalfNode() {
    if (head->next == NULL) {
        cout << "该链表没有节点,无法找到中间节点!" << endl;
        return NULL;
    }
    Node* first = head->next->next;
    Node* second = head->next;
    while (first&&first->next) {
        first = first->next->next;
        second = second->next;
    }
    return second;
}

如果采用两个指针刚开始是同时指向第一个节点的话,代码简单修改为如下:

Node* LinkList::findHalfNode() {
    if (head->next == NULL) {
        cout << "该链表没有节点,无法找到中间节点!" << endl;
        return NULL;
    }
    Node* first = head->next;
    Node* second = head->next;
    while (first&&first->next&&first->next->next) {
        first = first->next->next;
        second = second->next;
    }
    return second;
}

你可能感兴趣的:(不刷题心里难受,链表)