Remove Duplicates from Sorted List II

将有序链表中的重复元素全部删除,比如1->2->2->3结果是1->3,1->1->1结果是空。

1、我们先新建ListNode节点

public class ListNode
{
	int val;
	ListNode next;

	ListNode(int x)
	{
		val = x;
		next = null;
	}
}

2、为了方便测试,我们再新建List表,当输入-100时,退出循环。

public class List
{
	ListNode head,tail;
	int length;
	List()
	{
		head=null;
		tail=null;
	}
	public boolean isEmpty()//判断链表是否为真
	{
		return head==null;
	}
	
	public void addHead(int val)
	{
		head=new ListNode(val);
		head.next=null;
		if(tail==null)tail=head;
	}
	
	public void addToTail(int val)
	{
		if(!isEmpty())
		{
			tail.next=new ListNode(val);
			tail=tail.next;
		}
		else
		{
			head=tail=new ListNode(val);
		}
	}
	
	public void print(ListNode head)
	{
		ListNode p=head;
		while(p!=null)
		{
			System.out.print(p.val+" ");
			p=p.next;
		}
	}
	
	public ListNode createList()
	{
		Scanner sc=new Scanner(System.in);
		int number;
		while(sc.hasNext())
		{
			number=sc.nextInt();
			if(number==-100)break;
			else
			{
				addToTail(number);
			}
		}
		return head;
	}
}
3、接下来就是分析算法

这题的难点在1、如果重复元素出现在开头,我们就需要修改头指针。

                        2、如果中间重现不同的重复元素,如1->2->2->3->3->3->4->4,也就是假如在1的地方有一个指针,那该指针在遇到什么情况下才移动呢。

                        3、该题会设计到多个指针的使用,会有结尾元素单独处理的情况。

笔者解决该题思路是:1、我们首先解决头指针需要修改的情况,也就是head.val==head.next.val

                                        2、head指针不需要动了之后,p=head,q=head.next,r=q.next,那接下来,我们就需要判断p在什么情况下移动就可以了。

                                        如下图分析:

                                       

不管在什么情况下q、r指针都要移动。p移动的情况如下:

1、p.val!=q.val&&q.val!=r.val(p.next=q)(1->2->3->3的情况)                                                                                                                

 2、如上图q.val!=r.val&&r.val!=r.next.val(p.next!=q)

好,分析到这,接下来我们可以写程序了。

程序如下:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
   public ListNode deleteDuplicates(ListNode head)
	{
	if (head == null || head.next == null)
			return head;
		ListNode p = head;
		ListNode q = head.next;

		if (head.val == head.next.val)
		{
			while (q.next != null)
			{
				if (p.val != q.val && q.val != q.next.val)
				{
					head = q;
					p = q;
					q = q.next;
					break;
				}
				p = q;
				q = q.next;
			}
		}
		if (p.val == q.val)
			return null;
		else
		{
			if (q.next == null)
			{
				if (head.next != q)
					return q;
				else
				{
					return head;
				}
			}

		}
                //上面代码是修改头指针
                ListNode r = q.next;
		while (r.next != null)
		{
			if (p.val != q.val && q.val != r.val)
			{
				 if (p.next == q)
  					p = q;
                                 else{
                                      if (r.val != r.next.val)
                                             p.next=r;
                                      }					
			}
			q = r;
			r = r.next;
		}
		if (q.val == r.val)
			p.next = null;
		else
		{
			if (p.next != q)
				p.next = r;
		}
		return head;
	}
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值