标签:height 元素 就会 空指针异常 哈希 相同 class 需要 highlight
(删除链表中重复的节点)题目描述:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
解题思路:这里的重复的节点不保留是将只要重复了的节点都要删除掉,所以考虑利用哈希set的方法,先进行重复性的判断,将重复的元素加入到哈希set中去,然后将重复的元素删除。
利用到了两个指针pre和cur,来表示前一个节点和当前节点。
/*
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)
{
if(pHead == null){
return null;
}
//先找出相同节点存入哈希set中
HashSet<Integer> set = new HashSet<>();
ListNode pre = pHead;
ListNode cur = pHead.next;
while(cur != null){
if(cur.val == pre.val){
set.add(cur.val);
}
pre = cur;
cur = cur.next;
}
//再删除相同节点
/**
*删除头结点(若头结点是重复节点的话)
*/
while(pHead!=null&&set.contains(pHead.val)){
pHead = pHead.next;
}
if(pHead == null){
return null;
}
/**
*再删除中间节点
*/
pre = pHead;
cur = pHead.next;
while(cur != null){
if(set.contains(cur.val)){
pre.next = cur.next;
cur = cur.next;
}else{
pre = cur;
cur = cur.next;
}
}
return pHead;
}
}
(1)特别需要注意在删除头结点的时候,pHead = pHead.next;其实就是不停地在将头结点移向下一个节点,此时也需要进行头结点的空指针判断,若只是:
while(set.contains(pHead.val)){
pHead = pHead.next;
}
由于set集中如果存在头结点重复的情况,比如输入是这样的{1,1,1,1,1,1},就会报空指针异常:

所以如果是这种输入的情况的时候,就应该用下面的这种方式,进行头结点的空判断,然后返回一个null值。
while(pHead!=null&&set.contains(pHead.val)){
pHead = pHead.next;
}
if(pHead == null){
return null;
}
(2)还有就是删除当前重复的元素的时候,利用的是pre.next = cur.next;,立足于当前的cur元素,因为是当前cur元素在重复集set里面,需要删除。
标签:height 元素 就会 空指针异常 哈希 相同 class 需要 highlight
原文地址:https://www.cnblogs.com/dashenaichicha/p/12530712.html