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; } } }