题目描述:
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中没有重复出现的数字。
示例 1:
输入: 1->2->3->3->4->4->5 输出: 1->2->5
示例 2:
输入: 1->1->1->2->3 输出: 2->3
这道题是LeeCode上第82道题,这道题刚开始我的想法是用三个指针指来指去来做的,后来仔细想想只要新增一个虚拟指针指向头结点就能解决了,画个图直观一点。
先建一个虚拟节点;
由于链表是有序的,所以直接用head跟head.next的值作对比,如果不相等,则pre和head指针分别向右移动一位;
遍历到这里的时候,head的值和head.next的值相等,这时候我们只移动head指针,直到head和head.next的值不相等为止,
这时候我们要把两个3删除,只需要pre的next指针指向head的next指针就行了,
同样的,head指针右移,
这时候head和head.next的值又相等了,head指针右移,
这时候又把pre的next指针指向head的next指针就行了,最终返回虚拟指针的头结点就行了。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head==null) return head;
ListNode xuni=new ListNode(0); //虚拟节点
xuni.next=head;
ListNode pre=xuni;
while(head!=null){
while(head.next!=null && head.val==head.next.val){
head=head.next;
}
if(pre.next==head){
pre=pre.next;
}else{
pre.next=head.next;
}
head=head.next;
}
return xuni.next;
}
}
LeeCode上运行结果: