题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
一个容易理解的思路是:根据val求出无重复节点,然后重构链表。
import java.util.ArrayList;
public class Solution {
public ListNode deleteDuplication(ListNode pHead) {
if(pHead==null) return null;
ArrayList<Integer> list=new ArrayList<>();
while(pHead!=null){
list.add(pHead.val);
pHead=pHead.next;
}
ArrayList<Integer> list2=new ArrayList<>();
for(Integer i:list){
if (list.indexOf(i)==list.lastIndexOf(i))list2.add(i);
}
if(list2.size()<=0)return null;
ListNode newHead=new ListNode(list2.get(0));
ListNode p=newHead;
for(int i=1;i<list2.size();i++){
p.next=new ListNode(list2.get(i));
p=p.next;
}
return newHead;
}
}
或者使用递归寻找合法节点即可。
public class Solution {
public ListNode deleteDuplication(ListNode pHead)
{
return findNode(pHead);
}
public ListNode findNode(ListNode pHead){
//寻找合法node
ListNode p=pHead,q=pHead; //快慢指针
if(p!=null){
int count=0;
while(q!=null&&q.val==p.val){
count++; //出现次数
q=q.next; //直到第一个与p不同为止
}
if(count==1){
//p是合法节点
p.next=findNode(q);
return p;
}else return findNode(q); //不合法,从q寻找
}
return null;
}
}