劍指offer——O(1)時間刪除單鏈表節點


//爲保證在O(1)時間刪除,所以無法保證被刪除的節點一定在鏈表中,因此就需要函數調用者保證

#include <iostream>
using namespace std;

struct Node{
    int value;
    Node* next;
    Node(int vvalue) :value(vvalue), next(NULL){}
    ~Node(){
        cout << "~Node()" << endl;
    }
};

void DeleteNode(Node*& head, Node* toBeDeleteNode)
{
    if (head == NULL || toBeDeleteNode == NULL)return;
    if (toBeDeleteNode->next != NULL){//被刪除節點不是尾節點
        Node* nextNode = toBeDeleteNode->next;
        swap(toBeDeleteNode->value, nextNode->value);
        toBeDeleteNode->next = nextNode->next;
        delete nextNode;
        nextNode = NULL;
    }
    else if (toBeDeleteNode == head){//被刪除節點是尾節點且是頭結點
        delete toBeDeleteNode;
        toBeDeleteNode = NULL; head = NULL;
    }
    else{//被刪除節點是尾節點且不是頭結點
        Node* curNode = head;
        while (curNode->next != toBeDeleteNode){
            curNode = curNode->next;
        }
        curNode->next = NULL;
        delete toBeDeleteNode;
        toBeDeleteNode = NULL;
    }
}
int main()
{
    Node* node1 = new Node(1);
    Node* node2 = new Node(2);
    Node* node3 = new Node(3);
    Node* node4 = new Node(4);
    Node* node5 = new Node(5);
    Node* node6 = new Node(6);
    Node* node7 = new Node(7);
    node1->next = node2; node2->next = node3;
    node3->next = node4;
    node4->next = node5; node5->next = node6; node6->next = node7;
    Node* head = node1; Node* toBeDeleteNode = node7;
    DeleteNode( head, toBeDeleteNode);
    Node* curNode = head;
    while (curNode != NULL){
        cout << curNode->value << " ";
        Node* tmpNode = curNode;
        curNode = curNode->next;
        delete tmpNode;
    }
    cout << endl;
    system("pause");
}



《完》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章