码迷,mamicode.com
首页 > 其他好文 > 详细

删除元素的操作

时间:2015-08-25 16:10:31      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:

删除链表中多余的重复结点I

首先对于一个有序的结点递增的链表,删除重复的结点,只保留一份重复的结点。

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

  只需要一个结点指针就能够完成操作。

ListNode* deleteDuplicates(ListNode* head) 
{
	if(head == NULL)
	{
		return NULL;
	}
	ListNode *r = head;
	
	while(r->next != NULL)
	{
		if(r->val == r->next->val)
		{
			ListNode *tmp = r->next;
			r->next = tmp->next;
			delete tmp;
			tmp = NULL;
		}
		else
		{
			r = r->next;
		}
	}//while
	
	return head;
}

删除链表中重复的全部结点II

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

  注意这里有可能把头指针指向的结点删除了,所以要利用一个头结点,这样的话就可以不用单独的处理删除头指针指向的结点了。

ListNode* deleteDuplicates(ListNode* head) 
{
	ListNode *start = new ListNode(-1);
	start->next = head;
	if(head == NULL || head->next == NULL)
	{
		return head;
	}
	
	ListNode *pre = start;
	while(pre->next != NULL)
	{
		ListNode *cur = pre->next;
		while(cur->next != NULL && cur->next->val == cur->val)
		{
			cur = cur->next;
		}//while
		
		if(cur == pre->next)
		{
			pre = pre->next;
		}
		else
		{
			ListNode *tmp = pre->next;
			pre->next = cur->next;
			DeleteListNode(tmp, cur);
		}//else
	}//while
	
	return start->next;
}

void DeleteListNode(ListNode *start, ListNode *end)
{
	ListNode *tmp = NULL;
	while(start != end)
	{
		tmp = start;
		start = start->next;
		delete tmp;
	}
	delete start;
}

  

删除元素的操作

标签:

原文地址:http://www.cnblogs.com/stemon/p/4757431.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!