目录
1 题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
2 解题思路
首先,定义一个虚拟结点node,其后保存单链表中不重复的结点,最后返回node.next即可。
那么问题来了,如何找到不重复的结点呢?而且重复的结点不一定是2个相邻,有可能3个或者多个相邻,因为是排序的链表,我们就可以用while循环一直遍历,直到找到重复结点的下一结点为止。
因此,我们需要知道循环条件的出口:定义一个结点cur,从头开始遍历链表,当cur为null时,遍历完成。在遍历的过程中,比较cur与cur.next的值是否相等(在cur.next != null的情况下):
- 对于重复的结点,注意此时只判断了前后两个结点,所以我们又需要嵌套一个while循环,来找出重复结点的下一个结点。并舍弃这些重复的结点。
- 对于不重复的结点,我们将其用尾插法串在node结点之后,因为最后要返回链表头指针,所以再定义一个结点temHead指向node,让temHead遍历链表即可。
3 代码实现
public Node delAllNode(){
Node node = new Node(-1);
Node cur = this.head;
//始终存放不重复的结点
Node temHead = node;
while (cur != null){
if (cur.next != null&&cur.data == cur.next.data){
while (cur.next != null&&cur.data == cur.next.data){
cur = cur.next;
}
cur = cur.next;
//将temHead.next的指向更新,但保持temHead的值不变
temHead.next = cur;
}else {
//确定是不重复的结点,串在虚拟节点之后
temHead.next = cur;
temHead = cur;
cur = cur.next;
}
}
return node.next;
}