剑指Offer(链表)-删除链表中重复的节点
Posted dashenaichicha
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer(链表)-删除链表中重复的节点相关的知识,希望对你有一定的参考价值。
(删除链表中重复的节点)题目描述:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表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里面,需要删除。
以上是关于剑指Offer(链表)-删除链表中重复的节点的主要内容,如果未能解决你的问题,请参考以下文章