在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留。
样例1
输入:1->2->3->3->4->4->5
输出:1->2->5
样例2
输入:1->1->1->2->3
输出:2->3
思路:注意题目的意思是删除链表中的重复节点,也就是去掉全部重复的,而不是去重,这道题考的是对链表的操作、双指针操作。定义左右指针跳过中间重复的节点,直接把右指针拼接到左指针这边。
这题的代码直接写有点麻烦,因为如果开头的节点重复的话有点烦,看了大神的题解,找到了一个小技巧,凡是涉及到头结点,可以建立一个虚的节点插在链表的最前面,最后删掉就OK了。
参考代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteDuplication(ListNode head)
{
if(head==null)
return null;
ListNode ans=new ListNode(-1);
ans.next=head;
ListNode left=ans;
ListNode right=ans.next;
while(right!=null)
{
if(right.next!=null&&right.next.val==right.val)
{
while(right.next!=null&&right.next.val==right.val)
right=right.next;
right=right.next;
left.next=right;
}
else
{
right=right.next;
left=left.next;
}
}
return ans.next;
}
}