题目
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
知识点
链表
思路
感觉这道题看起来很简单,但是实际上处处都是坑啊。。。
解法一、
当链表为空或者只有一个结点时直接返回;
接下来我先处理头结点,当头结点存在重复的结点时一直循环,直到为空或头结点为不重复的结点;(注意处理,小心空指针异常)
再以此时的头结点为pre指向的位置,此时headVal = pre.next.val,而nextNode = pre.next.next;
循环判断headVal是否==nextNode.val,是则nextNode一直向后遍历,直到不是则退出循环,使pre.next = nextNode;
例如:1->2->2->2->3 最开始pre.val = 1, headVal = 2, nextNode = 第二个2,进入循环;循环退出后此时nextNode = 值为3的结点;此时1->3,pre.val=1;
pre为空或pre.next为空则退出循环,最后返回pHead。
解法二、两次遍历,第一次用HashMap存每个结点的值出现个数,第二次删除;代码略。
代码
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ListNode deleteDuplication(ListNode pHead)
{
if(pHead==null||pHead.next==null) return pHead;
int headVal = pHead.val;
while(headVal==pHead.next.val){
pHead = pHead.next;
while(pHead!=null&&headVal==pHead.val){
pHead = pHead.next;
}
if(pHead!=null&&pHead.next!=null) headVal = pHead.val;
else break;
}
ListNode pre = pHead;
while(pre!=null&&pre.next!=null){
headVal = pre.next.val;
ListNode nextNode = pre.next.next;
if(nextNode!=null&&headVal==nextNode.val){
while(nextNode!=null&&headVal==nextNode.val) nextNode = nextNode.next;
pre.next = nextNode;}
else pre = pre.next;
}
return pHead;
}
}