o(1)时间删除链表指定结点

来源:互联网 发布:好听的网络红歪歌 编辑:程序博客网 时间:2024/04/30 12:58

一、常规删除方法 o(n)
算法:
1、不需改变链表结构
2、从头开始遍历结点,找到待删除结点的前一个结点。

二、O(1)
算法:
1、改变链表结构,并且不能是尾节点。给定要删除节点的地址。
2、不一定非得要找到被删除结点的前一个结点,可以很方便的找到待删除结点的下一个结点,将下一节点内容复制到待删除结点,删除下一节点即可。
3、如果是根据内容删除结点,则不能使用。

struct ListNode {    int val;    struct ListNode *next;    ListNode(int x) :            val(x), next(NULL) {    }};void DeleteNode(ListNode* head,ListNode* NodeToDelete){    if(head == NULL ||NodeToDelete == NULL)        return;    //删除结点不是尾节点    if(NodeToDelete->next!=NULL){        ListNode* pNext = NodeToDelete->next;        NodeToDelete->val = pNext->val;        NodeToDelete->next = pNext->next;        delete pNext;        pNext = NULL;    }    //删除结点是尾节点且也是头结点    else if(head == NodeToDelete)    {        delete NodeToDelete;        head = NULL;        NodeToDelete = NULL;    }    //是尾节点不是头结点    else{        ListNode *p = head;        while(head->next != NodeToDelete)            p = p->next;        p->next = NULL;        delete NodeToDelete;        NodeToDelete = NULL;    }}

两种方法都需要注意:如果删除的是尾节点,需要指向NULL

0 0
原创粉丝点击