1、题目描述:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
2、思路:这道题只能从前往后遍历,若当前节点和下个节点的val值相等,当前这两个节点就是重复节点,是重复节点,就将下一个节点的next节点复制到当前节点上,进行覆盖。
3、代码:
public class Solution { public ListNode deleteDuplication(ListNode pHead) { if (pHead == null || pHead.next == null) { return pHead; } ListNode head = new ListNode(-1); // 新建一个头结点,防止链表中头结点是重复节点被删除。 ListNode trail = head; while (pHead != null) { ListNode node = pHead.next; boolean flag = false; //当前节点重复,node后移 while (node != null && pHead.val == node.val) { node = node.next; flag = true; } //若不重复,类似于重建链表了,将pHead这个节点连过来,trail指针后移 if (!flag) { trail.next = pHead; trail = trail.next; } //重复就将node赋值过来,相当于删除了重复节点,因为之前node后移了 pHead = node; } trail.next = null; // 1->2->3->3->3 return head.next; } }