牛客网高频算法题系列BM16删除有序链表中重复的元素II题目描述给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。 原题目见:删除有序链表中重复的元素II牛客题霸牛客网解法一:链表遍历首先,考虑特殊情况,如果链表为空或者只有一个结点,不会有重复的元素,返回原链表。 否则,遍历链表判断是否有重复元素,处理过程如下: 首先,因为头结点也可能重复,所以使用一个虚拟头结点dummyN 然后,用lastNonRedundantNode为上一个不重复的结点,初始化为头结点,count记录该结点的元素的重复次数,初始为1; 然后从原链表的第二个结点开始遍历; 如果当前结点的值和lastNonRedundantNode不相同,判断lastNonRedundantNode出现的次数,如果只出现过一次,则是一个不重复的结点,更新否则不更新pre。更新lastNonRedundantNode,并将count重置为1。 如果当前结点的值和lastNonRedundantNode相同,则将count加1。 最后,判断最后一个结点出现的次数,如果count为1,则也是不重复的结点。 最后,返回新构造的不重复元素的链表。代码publicclassBm016{删除有序链表中重复的元素IIparamheadListNode类returnListNode类publicstaticListNodedeleteDuplicates(ListNodehead){如果链表为空或者只有一个结点,不会有重复的元素,返回原链表if(headnullhead。nextnull){}因为头结点也可能重复,所以使用衣蛾虚拟头结点ListNodedummyNodenewListNode(1);pre未新构造的不重复元素的链表结点lastNonRedundantNode为上一个不重复的结点ListNodepredummyNode,lastNonRedundantNodehead,nexthead。count为上一个不重复的元素的重复次数intcount1;遍历链表while(next!null){如果当前结点的值和lastNonRedundantNode不相同,判断lastNonRedundantNode出现的次数,如果只出现过一次,则是一个不重复的结点更新pre,否则不更新pre更新lastNonRedundantNode,并将count重置为1if(next。val!lastNonRedundantNode。val){if(count1){pre。nextnewListNode(lastNonRedundantNode。val);prepre。}lastNonRedundantNcount1;}else{如果当前结点的值和lastNonRedundantNode相同,则将count加1}nextnext。}最后一个结点需要判断出现的次数if(count1){pre。nextnewListNode(lastNonRedundantNode。val);}returndummyNode。}publicstaticvoidmain(String〔〕args){ListNodeheadListNode。testCase6();System。out。println(原链表为);ListNode。print(head);System。out。println(删除有序链表中重复的元素后的链表为);ListNode。print(deleteDuplicates(head));}}1。01{365}37。7834343329 0。99{365}0。02551796445 相信坚持的力量!