跳到主要内容

C/C++寻找单链表中间节点 ?

参考答案:

在C/C++中,要寻找单链表的中间节点,我们通常使用快慢指针的方法。这种方法需要两个指针,一个快指针和一个慢指针。开始时,两个指针都指向链表的头节点。然后,快指针每次向前移动两个节点,而慢指针每次只向前移动一个节点。当快指针到达链表的末尾时,慢指针刚好在链表的中间。

下面是一个C++的实现示例:

#include <iostream>

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

ListNode* findMiddleNode(ListNode* head) {
    if (head == NULL) return NULL;

    ListNode *slow = head;
    ListNode *fast = head;

    while (fast != NULL && fast->next != NULL) {
        slow = slow->next;
        fast = fast->next->next;
    }

    return slow;
}

int main() {
    // 创建一个简单的单链表:1 -> 2 -> 3 -> 4 -> 5
    ListNode *head = new ListNode(1);
    head->next = new ListNode(2);
    head->next->next = new ListNode(3);
    head->next->next->next = new ListNode(4);
    head->next->next->next->next = new ListNode(5);

    // 寻找中间节点
    ListNode *middle = findMiddleNode(head);

    if (middle != NULL) {
        std::cout << "The middle node's value is: " << middle->val << std::endl;
    } else {
        std::cout << "The list is empty." << std::endl;
    }

    // 释放内存
    // ...

    return 0;
}

在这个示例中,findMiddleNode函数接受一个指向链表头节点的指针,并返回指向中间节点的指针。如果链表为空,它将返回NULL。在main函数中,我们创建了一个简单的单链表,并调用了findMiddleNode函数来寻找中间节点。然后,我们打印出中间节点的值。

注意:在实际应用中,你可能需要处理一些额外的情况,比如链表只有一个节点或者链表有偶数个节点(在这种情况下,中间可能有两个节点)。此外,记得在不再需要链表时释放内存,以避免内存泄漏。