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

题目描述

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% 的用户

发布了68 篇原创文章 · 获赞 2 · 访问量 6202

猜你喜欢

转载自blog.csdn.net/qq_30050175/article/details/90263835