面试题18:删除链表中重复的结点
一、题目描述
在一个排序的链表中,如何删除重复的节点?
链表结构定义如下
public class Node{
int val;
Node next;
public Node(int value,Node next) {
val=value;
next=next;
}
}
二、问题分析
在上一篇文章剑指Offer对答如流系列 - 在O(1)时间删除链表结点已经论述过链表节点的删除。这里不再多说。
这道题略有不同的是 链表的节点的值是符合排序的,我们很容易检测数值相同的节点,考虑到这种节点有多个(连续重复的情况),我们这里要稍作处理。其他操作都是非常常规的。
三、问题解答
具体解答如下:
public Node deleteDuplication(Node pHead){
Node pre = null;
Node cur = pHead;
while(cur!=null){
// cur指的是当前节点,当当前节点的下一个节点不为null 且与当前节点的值相同的时候 进行循环(解决连续重复的问题)
if(cur.next!=null && cur.next.val==cur.val){
while(cur.next!=null && cur.next.val==cur.val) {
cur=cur.next;
}
cur=cur.next;
if(pre == null) {
pHead=cur;
}
else {
pre.next=cur;
}
}else{
pre=cur;
cur=cur.next;
}
}
return pHead;
}