题目:删除链表中重复的结点
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
自己的解题思路,微low,但是还是要写一下:
解题思路:可以借助一个Map集合来进行记录链表中的元素出现的次数
将出现一次的元素重新组合成为新的链表然后进行返回。
代码实现:
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
import java.util.*;
public class Solution {
public ListNode deleteDuplication(ListNode pHead){
Map<Integer,Integer> mp=new HashMap<>();
while(pHead!=null) {
if(mp.containsKey(pHead.val)) {
mp.put(pHead.val, mp.get(pHead.val)+1);
}else {
mp.put(pHead.val, 1);
}
pHead=pHead.next;
}
ListNode curN=new ListNode(-1);
ListNode cur=curN;
Set<Integer> keySet = mp.keySet();
Iterator<Integer> it = keySet.iterator();
while(it.hasNext()) {
int key=it.next();
int val=mp.get(key);
if(val==1) {
cur.next=new ListNode(key);
cur=cur.next;
}
}
return curN.next;
}
}
借鉴别人的思路:
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
import java.util.*;
public class Solution {
public ListNode deleteDuplication(ListNode pHead)
{
ListNode curN=new ListNode(-1);
curN.next=pHead;
ListNode pre=curN;
ListNode last=curN.next;
while(last!=null) {
if(last.next!=null && last.val==last.next.val) {
while(last.next!=null &&last.val==last.next.val) {
last=last.next;
}
pre.next=last.next;
last=last.next;
}else {
pre=pre.next;
last=last.next;
}
}
return curN.next;
}
}