中间结点定义

1->2->3->4 中间结点为3
1->2->3->4->5 中间结点为3

ListNode* middleNode(ListNode* head) {
    ListNode* slow = head;
    ListNode* fast = head;
    while (fast != NULL && fast->next != NULL) {
        slow = slow->next;
        fast = fast->next->next;
    }
    return slow;
}

链表从中间断开

但有的题需要从链表中间结点断开,例如1->2->3->4->NULL断开为1->2->NULL和3->4->NULL两条链表,此时我们需要找中间结点的前一结点(2)。但链表节点数为奇数,则无区别。例如1->2->3->4->5->NULL断开为1->2->3->NULL和4->5->NULL

方法1:

ListNode* middleNode(ListNode* head) {
    ListNode* slow = head;
    ListNode* fast = head;
    while (fast->next != NULL && fast->next->next != NULL) {
        slow = slow->next;
        fast = fast->next->next;
    }
    return slow;
}

方法2:
当然也可以不修改while条件,而在while中先走fast,然后到尾就退出,此时slow少走一步即为中间结点前一结点。

while(fast != nullptr && fast->next != nullptr) {
    fast=fast->next->next;
    if(fast == nullptr || fast->next == nullptr) brk = slow; //找到中间的位置             slow = slow->next;
}
brk->next = nullptr;  // 将链表切开

zahlenw2
1 声望0 粉丝