删除链表中所有重复结点,重复结点不保留
分析:
定义一个假的结点头,将所有的不重复的结点串在其后面,最后返回该假的结点头的next就可以了。
在这个题里面,难点是如何将所有的重复结点都跳过去?
因为重复的结点不止两个,可能有是三个,四个等等,因为不知道要跳过多少个重复的结点,所以在这里需要用到一个while循环。
程序:
public Node deleteDuplication() {
Node fakeHead = new Node(-1); //定义的虚拟结点,其中所有不重复的结点都串在后面
Node lastNode = fakeHead ; //记录新链表的尾巴
Node cur = this.head;
//遍历原单链表,遍历的结束条件
while (cur != null) {
if (cur.next != null && cur.data == cur.next.data) {
//因为里面的重复元素可能有多个,所以需要再写一个循环,让cur走。同时cur可能为空,所以cur的next可能造成空指针异常。
while (cur.next != null&& cur.data == cur.next.data ) {
cur = cur.next;
}
cur = cur.next; //出来循环之后还应该再走一步,因为此时还没有完全跳过重复结点。
lastNode .next = cur; //因为过了上一组重复的结点之后,后面可能还会存在重复的结点,
// 所以暂时先将cur绑起来,但是lastNode不能向后移,向后移了就相当于将后面的结点直接串 起来了。
} else {
//确定不重复的结点,挂在虚拟结点后面。
lastNode .next = cur;
lastNode = lastNode .next;
cur = cur.next;
}
}
return fakeHead .next;
}