/**
* 删除有序链表中的重复节点
*/
public class RemoveDuplicateFromSortedList {
/**
* 删除有序链表中的重复节点,第一种方法,双指针,当遇到不相同的值时用前面的指针的next指向后面指针的内容
* @param head 链表
*/
public static void deleteDuplicateNode01(Node head){
//判断链表的长度必须大于1
if(head == null || head.next == null){
return;
}
Node before = head;
Node after = head.next;
while (before != null && after != null){
if(before.value != after.value){
before.next = after;
before = before.next;
}
after = after.next;
}
//千万不要忘了这步,忘了就会出现问题
before.next = null;
}
/**
* 第二种方法,新建链表,把不同的值放入新建的链表中然后返回,
* 注意得有返回值,容易理解不好实现,不推荐。
* @param head 链表的头
* @return 新建的链表
*/
public static Node deleteDuplicateNode02(Node head){
Node temp = head;
Node newList = null;
Node newHead = null;
while(temp != null){
if(newList == null){
//新建链表的头节点为空,则直接赋值
newList = temp;
//保存新建链表的头节点用于返回链表
newHead = newList;
}else if(newList.value != temp.value){
newList.next = temp;
newList = newList.next;
}
temp = temp.next;
}
//千万不要忘了这步,忘了就会出现问题
newList.next = null;
return newHead;
}
public static void main(String[] args){
Node list = new Node(0);
Node node1 = new Node(1);
Node node2 = new Node(1);
Node node3 = new Node(2);
Node node4 = new Node(3);
Node node5 = new Node(3);
Node node6 = new Node(3);
list.next = node1;
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
node5.next = node6;
deleteDuplicateNode01(list);
while (list != null){
System.out.println(list.value);
list = list.next;
}
// Node node = deleteDuplicateNode02(list);
//
// while (node != null){
// System.out.println(node.value);
// node = node.next;
// }
}
}
//链表节点
class Node{
int value;
Node next;
Node(int value){
this.value = value;
}
}