将有序链表中的重复元素全部删除,比如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;
}
}