题目描述:
给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
题目解答:
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head==null)
return head;
//初始化一个空结点dummy初始赋值为0,并且下一个next指针指向head
ListNode dummy=new ListNode(0,head);
ListNode cur=dummy;
while(cur.next!=null&&cur.next.next!=null){
int val=cur.next.val;
if(cur.next.next.val==val){
while(cur.next!=null&&cur.next.val==val)
cur.next=cur.next.next;
}
else{
cur=cur.next;
}
}
return dummy.next;
}
}
题目思路:
- 初始化:
- 创建名为
dummy
的新节点,其值为0,next指针指向传入的链表头head
。 - 创建指针
cur
,并初始化为dummy
,用于迭代遍历链表。
- 创建名为
ListNode dummy = new ListNode(0, head);
ListNode cur = dummy;
- 遍历链表:
- 使用
while
循环遍历链表,直到cur.next
或cur.next.next
为空。 - 在每一步循环中,检查
cur.next
和cur.next.next
节点的值是否相等。
- 使用
while (cur.next != null && cur.next.next != null) {
int val = cur.next.val;
// ...
}
- 删除重复元素:
- 如果
cur.next
和cur.next.next
的值相等,说明存在重复元素。 - 在这种情况下,使用内部的
while
循环来删除所有与当前值相同的节点,直到下一个不同的节点为止。
- 如果
if (cur.next.next.val == val) {
while (cur.next != null && cur.next.val == val)
cur.next = cur.next.next;
}
- 移动指针:
- 如果没有发现重复元素,移动指针
cur
到下一个节点,准备继续检查下一个节点。
- 如果没有发现重复元素,移动指针
else {
cur = cur.next;
}
- 返回结果:
- 返回处理后的链表,即
dummy.next
,因为dummy
节点是一个辅助节点。
- 返回处理后的链表,即
return dummy.next;