编写程序:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。
例:
原链表:1–>1–>1–>2–>3–>3–>4–>4–>4–>5->6–>6–>null
处理后:2–>5–>null
思路:
/*
三个引用分别用 黄(prev)、蓝(p1)、红(p2) 三种颜色代表
循环(直到 红色的p2 为空):
p1.val = p2.val( 蓝色的p1 所指向的值与 红色的p2 指向的值一样)
红色的p2 往后走,直到不相等(p1 != p2)
删除 [蓝色的p1,红色的p2) 结点 //包含p1,但不包含p2
黄色的prev 不动,蓝色的等于红色的(p1 = p2),红色的p2往后走
p1.val != p2.val
三个同时往后走(prev p1 p2)
*/
图形解释:
(1).
(2).
(3).
(4).
(5).
(6).
部分代码:
//删除有序链表中的重复结点
public Node deleteDuplicated(Node head) {
if (head == null) {
return head;
}
Node prev = null;
Node p1 = head;
Node p2 = head.next;
while (p2 != null) {
if (p1.val != p2.val) {
prev = p1; p1 = p2; p2 = p2.next;
} else {
while (p2 != null && p2.val == p1.val) {
p2 = p2.next;
}
if (prev == null) {
head = p2;
} else {
prev.next = p2;
}
p1 = p2;
if (p2 != null) {
p2 = p2.next;
}
}
}
return head;
}