面试题18:删除链表的节点 + 重复的节点

本文深入解析链表操作,包括O(1)时间删除链表节点的技巧,处理单节点和尾节点删除的情况,以及如何在排序链表中高效删除重复元素。通过具体示例和代码实现,帮助读者掌握链表的高级操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

  1. 删除排序链表中的重复元素 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% 的用户

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值