此题为力扣链表题目:
📌 文章目录:
题目:👇
1️⃣.题目解析
题目给定的是一个排序好的链表,所以重复结点的位置也一定是相邻的,此题需要定义一个傀儡结点,把不重复的结点都串连在傀儡结点后面,最后返回第一个不重复结点(新链表的头)即可
2️⃣.代码实现
步骤一、创建一个傀儡结点,其数值没有任何意义,任意一个数值即可,这里写的数值为 -1
ListNode newHead = new ListNode(-1);
步骤二、创建一个 tmp 用于寻找不重复的结点
ListNode tmp = newHead;
步骤三、定义一个 cur 用于遍历链表
ListNode cur = pHead;
步骤四、进入循环判断链表中有无重复结点,由于这里涉及到和下一个结点的数值比较,所以在这里需要判断一下,cur,.next 是不是为空,保证不会发生空指针异常,如果存在重复的结点,进入到循环,只要是重复的 cur 就继续向后走,直达走到最后一个重复的结点,结束循环,这时候 cur 指向的还是重复的结点,所以在循环结束后,cur 还需要往后多走一步,如果不是重复的结点,就把该结点串在傀儡结点的后面,依次进行直到 cur 遍历到链表的尾循环结束
while(cur != null){
if (cur.next != null && cur.val == cur.next.val){
while(cur.next != null && cur.val == cur.next.val){
cur = cur.next;
}
cur = cur.next;
}
else{
tmp.next = cur;
cur = cur.next;
tmp = tmp.next;
}
}
步骤五、循环结束后 tmp 为新链表的最后一个结点,把其 next 置空(当尾结点和其前面结点相同时,新链表的尾结点的 next 域不为空,需要置空)
tmp.next = null;
步骤六、返回新链表的头
return newHead.next;
3️⃣.全部代码
public class Solution {
public ListNode deleteDuplication(ListNode pHead) {
ListNode newHead = new ListNode(-1);
ListNode tmp = newHead;
ListNode cur = pHead;
while(cur != null){
if (cur.next != null && cur.val == cur.next.val){
while(cur.next != null && cur.val == cur.next.val){
cur = cur.next;
}
cur = cur.next;
}
else{
tmp.next = cur;
cur = cur.next;
tmp = tmp.next;
}
}
tmp.next = null;
return newHead.next;
}
}