这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战
给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
今天的题我就觉得他配不上中等,删除链表中重复元素,我们之前说过字符串的删除,大家可以参考这篇文章
那链表中怎么去做呢?我之前想了好多种办法,是不是可以用哈希,到最后,我仔细一读题1,排序链表,好家伙,你这和我扯啥?首先,他这个链表是排序的,就说明,我们这个重复的元素都是聚在一起的,那我们依次相比较就可以了
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head==null){
return head;
}
//创建一个新的头节点
ListNode nowhead=new ListNode(0,head);
ListNode temp=nowhead;
while(temp.next!=null&&temp.next.next!=null){
if(temp.next.val==temp.next.next.val){
int x=temp.next.next.val;
while(temp.next != null && temp.next.val == x){
temp.next=temp.next.next;
}
}else{
temp=temp.next;
}
}
return nowhead.next;
}
}
这道题虽然简单,但是,我们在写的过程中遇到了很多小细节的问题,我也是在经历好多次修改之后才解决我们这个问题。
首先就是删除的相关问题,我们删除是要删除我们重复的,元数据也不保留,所以如果我们的头节点也是一个重复元素,我们就需要删除我们的头结点,所以我们需要自己创建一个新的头节点。
其次,就是我们在第一个while的循环问题,因为我们重复的元素可能不仅仅就只有两个,我们有多个重复元素,我们需要把所有的重复元素都删除,如果只使用链表前后两个数据所比较我们会出现我们就只是删除了重复多余的部分,没有删除干净,我写的时候还会剩一个,所以我们可以创建一个变量来维护我们的比较的数据,与这个变量做对比。
最后,就是我们返回的一个小问题,我们最开始创建了一个空节点,为了防止头节点被删除,所以我们在返回的时候需要返回我们创建节点的next才是我们原来头节点的位置