/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
核心思想:判断当前节点是否需要删除的方法是检查当前节点是否与相邻的前后节点相等。
定义一个fast指针来遍历链表
定义一个preFast指针来记录fast的前一位
定义一个slow指针来记录删除以后的链表末元素
fast指针和preFast指针不断的往后走
如果判断fast节点不需要删除,则slow指针的next指向fast节点
如果判断fast节点需要删除,则slow指针不动,fast和preFast往后移动一步,以此类推
注意: 对于要对列表修改的场景要注意是否会修改头节点,如果可能会修改头结点,最好新定一个preHead哑节点,这样代码处理更方便
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head == null || head.next == null){
return head;
}
ListNode preHead = new ListNode();
preHead.next = head;
preHead.val = -111111111;
ListNode slow = preHead;
ListNode preFast = preHead;
ListNode fast = head;
while(fast != null){
if(preFast.val != fast.val && (fast.next == null || fast.next.val != fast.val)){
slow.next = fast;
slow = fast;
}
fast = fast.next;
preFast = preFast.next;
}
slow.next = null;
return preHead.next;
}
}