有一个整数单链表L,设计一个算法删除其中所有值为x的结点。例如L=(1,2,2,3,1),x=2,删除后L=(1,3,1)。
public class MyLinkedList {
class Node {
//定义的节点类
int val;//节点的数据域
Node next;//节点的地址域
Node(int val) {
//构造方法
this.val = val;
}
}
int size;//链表的size属性,表示链表长度
Node head;//链表的第一个元素的引用
/** Initialize your data structure here. */
public MyLinkedList() {
//初始化链表
this.size = 0;
this.head = null;
}
//头部插入
public Node addAtHead(int val) {
Node dummyHead = new Node(-1);
//这里使用虚拟头节点的方法,目的是让头节点作为虚拟链表的第二个节点这样不需要对头节点特殊处理
dummyHead.next = head;
Node cur = new Node(val);//实例化一个元素值为val的节点
//插入
cur.next = head;
dummyHead.next = cur;
head = cur;
size ++;
//更改头节点指向
head = dummyHead.next;
return dummyHead.next;
}
//尾部插入
public Node addAtTail(int val) {
Node dummyHead = new Node(-1);
dummyHead.next = head;
Node cur = dummyHead;
while(cur.next != null){
cur = cur.next;
}
Node tail = new Node(val);
tail.next = null;
cur.next = tail;
size ++;
return dummyHead.next;
}
public String toString(){
String ret = "";
Node node = head;
while(node != null){
ret += node.val + "->";
node = node.next;
}
ret +="NULL";
return ret;
}
/**
* 删除链表中 所有值为val 的结点
*/
public void removeAllValue(int val) {
while (head != null && head.val == val) {//2,2,2,2极端情况
// 头节点就是待删除节点
Node x = head;
head = head.next;
x.next = null;
size --;
}
// 头节点一定不是待删除的节点
// 判空
if (head == null) {
// 链表删完了
return;
} else {
Node prev = head;
while (prev.next != null) {
// 至少还有后继结点
if (prev.next.val == val) {
// 此时prev.next就是待删除的结点
Node node = prev.next;
prev.next = prev.next.next;
node.next = null;
size--;
} else {
// 只有当prev.next.val != val才能移动prev指针!
prev = prev.next;
}
}
}
}
public static void main(String[] args) {
MyLinkedList myLinkedList = new MyLinkedList();
myLinkedList.addAtHead(1);
myLinkedList.addAtTail(2);
myLinkedList.addAtTail(2);
myLinkedList.addAtTail(3);
myLinkedList.addAtTail(1);
myLinkedList.removeAllValue(2);
System.out.println(myLinkedList);
}
}