题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
示例1
输入:
{1,2,3,3,4,4,5}
返回值:
{1,2,5}
思路
我们需要定义三个指针curHead:遍历链表;pre:前驱用来连接可能断掉的链表;flg:最后返回的虚拟结点
1.先判断curHead.val == curHead.next.val ,因为可能有重复的结点,所以我们需循环判断是否相等,相等curHead往后移
此时curHead.val != curHead.next.val,所以我们让curHead再往后移
以此类推
2.如果不相等,第一次不相等flg.next需记录第一个结点位置;pre = curHead,curHead往后移
代码实现
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ListNode deleteDuplication(ListNode head) {
if(head == null || head.next == null)return head;
ListNode curHead = head;
//pre为定义的前驱结点,为了连接可能断开的结点
ListNode pre = new ListNode(-1);
//最后返回flg.next
ListNode flg = pre;
while(curHead != null) {
if( curHead.next != null && curHead.val == curHead.next.val) {
//可能有连续的重复
while(curHead.next != null && curHead.val == curHead.next.val) {
curHead = curHead.next;
}
curHead = curHead.next;
}else {
pre.next = curHead;
pre = curHead;
curHead = curHead.next;
}
}
//把最后一个元素的next置为null
pre.next = null;
return flg.next;
}
}