public class ListNodeDemo01 {/**
* 删除链表中全部重复元素
* @param node 传入链表头
* @return 返回头节点指针
*/
public static Node delDup(Node node) {
//生成一个头节点
Node first = new Node(-1);
Node cur = node;
first.next = node;
//找个头节点的代理节点
Node proxy = first;
if(node == null) {
return null;
}
while(cur != null && cur.next != null) {
if(cur != null && cur.data == cur.next.data) {
//后面可能还有2
//2,2,2,3
int val = cur.data;
while(cur != null && cur.data == val) {
//这里一直找到那个新的cur->3
cur = cur.next;
}
//直到找到3,把前面的去掉,改变链,proxy的后面就是3
proxy.next = cur;
}else {
//假如都不一样,那么第一个就是proxy了,链还是原来的链,proxy慢慢往后推
//1,2,3
proxy = cur;
//确定新的cur,准备下一轮
cur=cur.next;
}
}
//返回头的下一个
return first.next;
}
/**
* 删除链表中重复的元素,重复的只保留一个
* @param node 传入头节点
* @return 返回头节点
*/
public static Node DelMoreDup(Node node) {
Node first = new Node(-1);
Node cur= node;
first.next = node;
//代理头节点
Node proxy = first;
if(node == null) {
return null;
}
while(cur != null && cur.next != null) {
if(cur != null && cur.data == cur.next.data) {
//1,1,1,2,3
//此时proxy = first 保留第一个,要把proxy = cur;
proxy = cur;
int val = cur.data;
while(cur != null && cur.data == val) {
cur = cur.next;
}
proxy.next = cur;
}else {
//1,2,3,4,4,4,5,6
proxy = cur;
cur = cur.next;
}
}
return first.next;
}
}
class Node{
int data;
Node next;
public Node(int data) {
this.data = data;
}
public void append(Node node) {
Node currentNode = this;
while(true) {
if(currentNode.next == null) {
currentNode.next = node;
break;
}
currentNode = currentNode.next;
}
}
public void show() {
Node currentNode = this;
while(true) {
System.out.println(currentNode.data);
if(currentNode.next == null) {
break;
}
currentNode = currentNode.next;
}
}
}