题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
我自己的解
public class Solution {
public ListNode deleteDuplication(ListNode pHead)
{
if(pHead == null || pHead.next == null){
return pHead;
}
ListNode temp = new ListNode(Integer.MIN_VALUE);
temp.next = pHead;
ListNode first = pHead;
ListNode second = temp;
while(first != null && first.next != null){
if(second.next.val == first.next.val){
first = first.next;
if((first.next == null) || second.next.val != first.next.val){
first = first.next;
second.next = first;
}
}else{
first = first.next;
second= second.next;
}
}
return temp.next;
}
}
这个是一步一步按我的想法推出来的,并且根据测试用例不断的调整出来的,所以代码看起来比较丑,有空我会把整理之后的代码也贴上来。
一开始我想通过来个指针来实现,一个指针用来记录上一个非重复节点,设为second,一个指针不断的向前移动,设会frist,当first的下一个节点和second的下一个节点一样时,说明有重复节点,然后first不断向后移动,直到first的下一个节点与second的下一个节点不等,然后更新second的next节点。
后来发现,如果是链表的第一个节点就是重复节点的话,如果将second仍初始化在头节点的话,是不容易将其删去的,所以加了一个节点放在头结点的前面表示第一个重复节点,返回时只需要将该节点的下一个节点return即可。
有几个需要注意的点
- while的判断条件为
first != null && first.next != null
,其中
-
first.next != null
是我在判断是否是重复节点的时候,会使用next.val所以next是不能为空的,如果next是空的,调用val就会报错 -
first != null
是在发现重复节点,并且去除重复节点,将first和second连接的时候,我的first在本次while循环中走了两步,有可能此时first已经走到了最后一个节点的后面。所以这个时候我就可以停止循环了,这个判断条件也可以改到下面注释中所示的位置
if((first.next == null) || second.next.val != first.next.val){//①
first = first.next;
second.next = first;
//if(first == null) break;
}
- 还有上面①所示的位置的判断条件,由于当first.next为空的时候,就不能比较他们两个的值了,但是此时也是默认second.next和first.next的值不等的,所以需要将他加上
下面这个代码和上面的思路一样,只不过把一些东西抽离出来了,方便理解。
public class Solution {
public ListNode deleteDuplication(ListNode pHead)
{
if(pHead == null || pHead.next == null){
return pHead;
}
ListNode temp = new ListNode(Integer.MIN_VALUE);
temp.next = pHead;
ListNode first = pHead;
ListNode last = temp;
while(first.next != null){
if(last.next.val == first.next.val){
first = first.next;
if(first.next == null){
last.next = null;
break;
}
if(last.next.val != first.next.val){
first = first.next;
last.next = first;
}
}else{
first = first.next;
last = last.next;
}
}
return temp.next;
}
}