题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
L - 0082】- m - 删除排序链表中的重复元素 II(包含)⭐⭐
实现-lc
public ListNode deleteDuplicates(ListNode head) {
if (head == null) return null;
ListNode dummy = new ListNode(0, head);
ListNode cur = dummy;
while (cur.next != null && cur.next.next != null) {
if (cur.next.val == cur.next.next.val) {// 1 相等->处理
int val = cur.next.val;
while (cur.next != null && cur.next.val == val) {//做覆盖替换
cur.next = cur.next.next;
}
} else {// 2 不相等->后移
cur = cur.next;
}
}
return dummy.next;
}
实现-jz
/**面试18.2 删除链表中的重复节点##
*/
public class C18_list_DeleteRepetition {
public static class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
//3种方法 https://blog.csdn.net/zjkC050818/article/details/72897164
public static ListNode deleteDuplication(ListNode head) {//循环实现
if (head == null || head.next == null)
return head;
ListNode preNode = null; //当前节点的前一个节点
ListNode node = head;
while (node != null) {
ListNode next = node.next; //该节点的下一个节点
boolean needDelete = false;
if (next != null && next.val == node.val)//与下一个节点重复
needDelete = true;
if (!needDelete) {/*不需要删除遍历下一个节点*/
preNode = node;//当前节点为前节点
node = node.next; //循环下一个节点
} else { /*需要删除node*/
int value = node.val;
ListNode toBeDel = node;
while (toBeDel != null && toBeDel.val == value) {
next = toBeDel.next;
toBeDel = next;//next前移覆盖掉要删除的node
}
if (preNode == null)
head = next; //前一个元素不存在,next作为head
else
preNode.next = next;
node = next; //循环下一个节点
}
}
return head;
}
}
Test
public static void main(String[] args) {
ListNode node1 = new ListNode(1);
ListNode node2 = new ListNode(2);
ListNode node3 = new ListNode(3);
ListNode node4 = new ListNode(3);
node1.next = node2;
node2.next = node3;
node3.next = node4;
ListNode head = node1;
while (head != null) {
System.out.println(head.val);
head = head.next;
}
System.out.println("-----------");
ListNode node = deleteDuplication(node1);
while (node != null) {
System.out.println(node.val);
node = node.next;
}
}