题目
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。返回同样按升序排列的结果链表。
思路:一边遍历一边比较,设置两个节点指针。如果val值一样,我们就让temp2后移直到val值不一样,然后temp1.next直接指向temp2即可。最后直到temp2为空即可。
public ListNode deleteDuplicates(ListNode head) {
// 定义一个带头节点的新链表
ListNode list1 = new ListNode(0,head);
// temp1指向原链表的第一个节点
ListNode temp1 = list1.next;
// 如果temp1为空,那说明原链表是空的,直接返回即可
if(temp1 == null){return head;}
// temp2为temp1后面的那个节点
ListNode temp2 = temp1.next;
// 只要temp2不为空,我们就一直执行
while (temp2!=null){
// 如果temp2的val 和 temp1的val相等 我们就往后移动temp2
// 如果temp2是最后一个元素,那temp2.next会造成空指针异常
// 所以这里要加一个temp2!=null
while (temp2!=null && temp2.val == temp1.val){
temp2 = temp2.next;
}
// 当退出这个while循环时,有二种情况
/*
1.temp2为空
2.temp2不为空,但值不相等
*/
// 如果是第一种情况,我们就认为遍历结束了,直接让temp1指向null就行。
// 这里解释一下,遍历结束有可能是相等的,比如最后是3,3。当然也有可能不相等
// 但无论怎么样,让temp1最终都是指向null的
if(temp2 == null){
temp1.next = null;
break;
}else {
// 如果是第二种情况,说明遍历还没结束,也就是找到了不等于temp1.val的temp2
// 这时候 我们把temp1的next指向temp2并且更新两者即可;
temp1.next = temp2;
temp1 = temp2;
temp2 = temp1.next;
}
}
// 最后 去掉头节点返回
ListNode result = list1.next;
return result;
}
时间复杂度为O(n)