83. 删除排序链表中的重复元素
解题思路
-
边界条件检查:首先检查给定的链表是否为空(head == null)。如果链表为空,则直接返回null,因为没有元素可以删除。
-
快慢指针初始化:定义两个指针slow和fast,其中slow指针指向当前不重复的最后一个元素,fast指针用于遍历链表寻找下一个不重复的元素。初始时,slow指向链表的头节点head,而fast指向head的下一个节点。
-
遍历链表:使用fast指针遍历整个链表。对于每个节点,比较slow指针指向的元素与fast指针指向的元素:
-
如果两者的值不相同(fast.val != slow.val),说明fast指向的元素是一个新的、不重复的元素。因此,将slow的next指针指向fast,然后更新slow指针,让它移动到fast所在的位置,即slow = slow.next。
-
如果两者的值相同,就继续移动fast指针,寻找下一个可能的不重复元素。
结束处理:当fast指针遍历完链表后,需要将slow指针的next设置为null,以确保链表的末尾不会连接到重复的元素。 -
返回结果:返回处理后的链表头节点head。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head == null){
return null;
}
ListNode slow = head;
ListNode fast = head.next;
// 快慢指针
while(fast != null){
if(fast.val != slow.val){
slow.next = fast;
slow = slow.next;
}
fast = fast.next;
}
// 断开和后面重复元素的连接
slow.next = null;
return head;
}
}