LeetCode82. 删除排序链表中的重复元素 II
题目说明
/**
*
* 存在一个按升序排列的链表,给你这个链表的头节点 head ,
* 请你删除链表中所有存在数字重复情况的节点,
* 只保留原始链表中 没有重复出现 的数字。
*
* 返回同样按升序排列的结果链表。
*
*/
思路分析
- 删除链表中重复的元素,因为链表是按顺序排列的,因此进行一次遍历,将重复的删除即可
- 删除重复的元素,是指将重复的元素全部删除,只剩余不重复的,因为链表中重复的元素可能有多个,即一个元素可能出现多次,因此需要使用循环删除
- 要删除链表的当前节点,需要先找到链表的前一个节点,因为直接找到要删除的节点是删除不了的
- 考虑到链表的前两个元素可能是重复的,因此需要创建一个空的头节点,让它的下一节点指向head,方便删除head的头节点
- 先判断当前节点的下一节点的值和下一节点的后一节点的值是否相等,如果相等,则记录相等的节点的值,然后删除这两个节点,并判断后边节点的值是否也等于这个值,如果也相等,则再删除
- 循环结束后,则删除完毕
- 源码见下
源码及分析
/**
*
* @param head 要删除重复元素的链表
* @return 返回删除后的新链表
*/
public ListNode deleteDuplicates2(ListNode head) {
//判断节点是否为空或者是否只有一个节点
if (head == null || head.next == null){
return head;
}
//因为链表的第一第二个元素可能重复,因此需要一条新链表让它的下一个元素指向head
ListNode newHead = new ListNode(0,head);
//定义辅助变量用于遍历
ListNode cur = newHead;
while (true){
//循环结束的条件
if (cur.next == null || cur.next.next == null){
break;
}
//如果要删除当前节点,必须找到要删除节点的前一个节点
if (cur.next.val == cur.next.next.val){
//定义变量保存重复值的第一个元素
int value = cur.next.val;
//循环判断是否有重复的多个元素,将其都删除
while (cur.next != null && cur.next.val == value){
cur.next = cur.next.next;
}
//如果不重复,则指针后移指向后一个节点继续判断
}else {
cur = cur.next;
}
}
return newHead.next;
}