题目描述
O(1)时间内删除链表节点
顺序查找,复杂度位O(n)
直接把下一个节点内容复制,再指向下一个节点的下一个节点,删除下一个节点。
- 只有一个节点情况
- 尾节点删除
void DeleteNode(ListNode **pListHead. ListNode *pToDelete)
{
if(!pListNode || !pToDelete)
{
return;
}
if(pToDelete->m_pNext != nullptr)
{
ListNode *pNext = pToDelete->m_pNext;
pToDelete->m_pValue = pNext->val;
pToDelete->m_pNext = pNext->m_pNext;
delete pNext;
pNext = nullptr;
}
else if(*pListHead == pToDelete)
{
delete pToDelete;
pToDelete = nullptr;
*pListHead = nullptr'
}
else
{
ListNode *pNode = *pListHead;
while(pNode->m_pNext != pToDelete)
{
pNode=pNode->m_pNext
}
pNode->m_pNext = nullptr;
delete pToDelete;
pToDelete = nullptr;
}
}
Q:如果要删除的节点不在链表内呢?
需要O(n)时间才能判断
删除重复的节点
删除列表中重复的节点
我的思路:定义两个节点指针,p,q=p->next;
当q == p,q=q->next直到不与p相等
此时p->next = q;p = q; q=q->next
直到q->next ==nullptr
leetcode
- 删除排序链表中的重复元素 II
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中没有重复出现的数字。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode *pre = nullptr;
ListNode *node = head;
while(node != nullptr)
{
ListNode* next = node->next;
bool duplicate = false;
if(next != nullptr && next->val == node->val)
{
duplicate = true;
}
if(!duplicate)
{
pre = node;
node = node->next;
}
else
{
int value = node->val;
ListNode *deletenode = node;
while(deletenode !=nullptr && deletenode->val == value)
{
next = deletenode->next;
delete deletenode;
deletenode = nullptr;
deletenode = next;
}
if(pre==nullptr)
head = next;
else pre->next = next;
node = next;
}
}
return head;
}
};
注意,释放一个节点:
delete deletenode;
deletenode = nullptr;
执行用时 : 12 ms, 在Remove Duplicates from Sorted List II的C++提交中击败了96.96% 的用户
内存消耗 : 9.3 MB, 在Remove Duplicates from Sorted List II的C++提交中击败了5.23% 的用户