在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留。
样例1
输入:1->2->3->3->4->4->5
输出:1->2->5
样例2
输入:1->1->1->2->3
输出:2->3
思路:
由于首节点有可能被删,删了就不好办了,我们要声明一个虚拟头节点,
然后需要两个指针一个指向当前节点,另一个q指向下一个节点,只要当前节点的下一个节点的值等于q的节点,q就往后走,
如果有一样的元素,q走到最后肯定与curr的下一个下一个节点是不一样的,这就是重复情况要去掉重复的节点
//定义单链表
public static class Node{
Node next;
int val;
public Node(int val,Node pnext){
this.val = val;
this.next = pnext;
}
public Node(){}
}
//遍历单链表
public static void travelist(Node head){
Node curr = head;
while(curr!=null){
System.out.print(curr.val+" ");
curr = curr.next;
}
System.out.println();
}
//核心代码 删除重复元素
public static Node deleteReaped(Node head){
//为了解决把头节点也删掉的情况,声明一个虚拟头节点
Node ihead = new Node();
ihead.next = head;
Node curr = ihead;
Node q = curr.next;
while(curr.next!=null){//从虚拟头节点开始向后
while(q!=null&&curr.next.val==q.val){判断curr后面有没有重复的数字,如果有的话q一直在往后走,直到走到与前面一段不重复的第一个数字
q = q.next;
}
if(curr.next.next==q){//说明q只往后挪了一个位置,因为没有遇到相同的,后面没有重复元素
curr = curr.next;//把当前参照物在往后移
}
else{//遇到重复元素
curr.next=q;//去掉重复元素
}
}
return ihead.next;
}
public static void main(String[] args) {
Node p4=new Node(3, null);
Node p3=new Node(2, p4);
Node p2=new Node(1, p3);
Node p1=new Node(1, p2);
Node re = deleteReaped(p1);
travelist(re);
}
1 1 2 3
2 3
Process finished with exit code 0