题目
代码
代码解释
初始化
执行:0
与链表的其他题目类似,为了防止删除头结点的极端情况发生,先创建空结点dummy(newHead),使dummy指向传入的head结点。
第一次循环:
执行代码:1—while条件不满足,不执行
执行代码:2.2—newListNode指向oldListNode(虚线框)
执行代码:3—oldListNode从虚线框的位置到下一个位置,得到下图
第二次循环跟第一次一样,得到下图
第三次循环
执行代码:1—while条件满足,执行while中的代码,跳出while后,num的值为2,oldListNode指向虚线框
执行代码:2.1—newListNode的next指向4(注意:仅是将next指向4,newListNode还未指向4)
执行代码:3—oldListNode指向4
得到下图
第四次循环同第三次,循环结束后,
newListNode的next指向5(注意:仅是将next指向5,newListNode还未指向5)
oldListNode指向5
第五次循环
执行代码:2.2—newListNode指向oldListNode(虚线框)
执行代码:3—oldListNode从虚线框的位置到下一个位置,得到下图
第六次循环条件不满足,不执行循环,执行return语句
附录:代码
public ListNode deleteDuplicates(ListNode head) {
if (head == null || head.next == null) {
return head;
}
// 用来存储最后返回的链表的头
ListNode newHead = new ListNode(-1);
newHead.next = head;
// 新的的链表移动节点,通过该节点来建立新的链表
ListNode newListNode = newHead;
// 用来计算重复节点的临时节点,用来遍历旧的链表
ListNode oldListNode = head;
while (oldListNode != null) {
int num = 1;
// 如果旧的链表活动节点的next不为空,且该节点的值和该节点的下个节点的值不为空,则重复数++
while (oldListNode.next != null && oldListNode.val == oldListNode.next.val) {
++num;
oldListNode = oldListNode.next;
}
if (num >= 2) {
// 有重复节点的话跨过重复节点,即将newListNode的next指向重复节点后面的节点,即将重复节点后面的节点添加到新的链表
newListNode.next = oldListNode.next;
} else {
// 无重复节点的话则将newListNode移动到下一个节点。因为这两个节点之间是已经连接起来的,直接移动newListNode到下一个节点
newListNode = oldListNode;
}
// 移动旧节点到下一个节点
oldListNode = oldListNode.next;
}
return newHead.next;
}