82. Remove Duplicates from Sorted List II && i

Posted 小河沟大河沟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了82. Remove Duplicates from Sorted List II && i相关的知识,希望对你有一定的参考价值。

题目

83. Remove Duplicates from Sorted List

 Given a sorted linked list, delete all duplicates such that each element appear only once.

For example,
Given 1->1->2, return 1->2.
Given 1->1->2->3->3, return 1->2->3. 

解析

class Solution_83 {
public:
	ListNode *deleteDuplicates(ListNode *head) {

		if (!head||!head->next)
		{
			return head;
		}

		ListNode* cur = head;
		ListNode*pre = NULL;
		while (cur&&cur->next)
		{
			pre = cur;
			cur = cur->next;
			ListNode* temp = pre; //记录每次重复点的开始位置
		    while(cur&&pre->val==cur->val)
			{
				pre = cur;
				cur=cur->next;
			}
			temp->next = cur; //跳过重复位置
		}
		return head;
	}
};

82. Remove Duplicates from Sorted List II

 Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.

For example,
Given 1->2->3->3->4->4->5, return 1->2->5.
Given 1->1->1->2->3, return 2->3. 

解析

  • 由于链表开头可能会有重复项,被删掉的话头指针会改变,而最终却还需要返回链表的头指针。所以需要定义一个新的节点,然后链上原链表,然后定义一个前驱指针和一个现指针,每当前驱指针指向新建的节点,现指针从下一个位置开始往下遍历,遇到相同的则继续往下,直到遇到不同项时,把前驱指针的next指向下面那个不同的元素。如果现指针遍历的第一个元素就不相同,则把前驱指针向下移一位。

//参考容易理解一些
ListNode *deleteDuplicates(ListNode *head) {
        if (!head || !head->next) return head;
        
        ListNode *start = new ListNode(0);
        start->next = head;
        ListNode *pre = start;
        while (pre->next) {
            ListNode *cur = pre->next;
            while (cur->next && cur->next->val == cur->val) cur = cur->next;
            if (cur != pre->next) pre->next = cur->next;
            else pre = pre->next;
        }
        return start->next;
    }


// 82. Remove Duplicates from Sorted List II
class Solution_82 {
public:
	ListNode* deleteDuplicates(ListNode* head) {

		if (!head||!head->next)
		{
			return head;
		}

		ListNode*newHead = new ListNode(0);
		newHead->next = head;

		ListNode* pre = newHead;
		ListNode* cur = head;
		
		while (cur&&cur->next)
		{
			ListNode* next = cur->next;
		
			if(next->val!=cur->val)
			{
				if (pre->next==cur) //pre->next当前元素开始,cur当前元素结束,cur->next另外不同的元素
				{
					pre = cur;
				}
				else
				{
					pre->next = cur->next;
				}
			}
			cur = cur->next;
		}
		if (pre->next!=cur) //这里是地址比较,若没有重复元素,则地址相同的
		{
			pre->next = cur->next;
		}
		return newHead->next;
	}
};

题目来源

以上是关于82. Remove Duplicates from Sorted List II && i的主要内容,如果未能解决你的问题,请参考以下文章

82. Remove Duplicates from Sorted List II

82. Remove Duplicates from Sorted List II(js)

82. Remove Duplicates from Sorted List II

82. Remove Duplicates from Sorted List II

82. Remove Duplicates from Sorted List II

82. Remove Duplicates from Sorted List II