20170917_删除单链表中的指定节点

来源:互联网 发布:js的杀破狼为什么下架 编辑:程序博客网 时间:2024/05/22 14:33

20170917_删除单链表中的指定节点


题目1:删除带头结点的单链表L中的结点p,p不是最后一个结点,要求时间复杂度为O(1)。
解题思路:
如果不要求时间复杂度为O(1),我们可以找出p的前驱结点,然后很容易就删除p。
现在要求时间复杂度为O(1),因为p不是最后一个结点,知道结点p我们可以删除p的后继结点,
那么我们可以把p的后继结点元素的值赋给p结点元素的值。

struct ListNode{int value;ListNode *pNext;ListNode(int x):value(x), pNext(nullptr) {}};//p不是最后一个结点void DeleteNode(ListNode * &p){if(p==nullptr || p->pNext==nullptr)return;//p为空,或是单链表中最后一个节点,不符合题意。ListNode *temp_next=p->pNext;p->value=temp_next->value;p->pNext=temp_next->pNext;delete(temp_next);//删除节点temp_nexttemp_next=nullptr;//将节点置为空,防止它成为野指针}

题目2:如果删除的结点p可能是最后一个结点,怎么办?
解题思路:此时只能保证删除结点的平均时间复杂度为O(1),当p不是最后一个结点,
时间复杂度为O(1),当p是最后一个结点时,时间复杂度为O(n)。

struct ListNode{int value;ListNode *pNext;ListNode(int x):value(x), pNext(nullptr) {}};void DeleteNode(ListNode * &p){if(p==nullptr || p->pNext==nullptr)return;//p为空,或是单链表中最后一个节点,不符合题意。if(p->pNext != nullptr)//如果p不是最后一个节点{ListNode *temp_next=p->pNext;p->value=temp_next->value;p->pNext=temp_next->pNext;delete(temp_next);//删除节点temp_nexttemp_next=nullptr;//将节点置为空,防止它成为野指针}else//如果p是最后一个节点{ListNode *pHead;//单链表的头结点指针pHeadListNode *pre=pHead;while(pre->pNext!=p)pre=pre->pNext;pre->pNext=p->pNext;delete(p);p=nullptr;}}




原创粉丝点击