package test.written.examination;
public class SingleLinkedList {
public class Node {
int data;
Node next;
public Node(int n) {
data = n;
next = null;
}
public Node() {
data = 0;
next = null;
}
}
Node head, tail;
public SingleLinkedList() {
head = tail = null;
}
public void mp() {
if (head == null) {
System.out.println("empty!");
} else {
System.out.print(head.data + ",");
Node node;
node = head.next;
while (node != null) {
System.out.print(node.data + ",");
node = node.next;
}
}
}
// 添加在头部
public void addHeadNode(int n) {
Node t = new Node(n);
if (head == null) {
head = t;
} else {
t.next = head;
head = t;
}
}
// 添加在尾部
public void addTailNode(int n) {
Node p = head;
if (p == null) {
head = new Node(n);
return;
}
Node tmp = null;
while (p != null) {
tmp = p;
p = p.next;
}
tmp.next = new Node(n);
}
// 只删除第一个data=n的节点
public void deleteOne(int n) {
if (head.data == n) {
head = head.next;
return;
}
Node pre = head;
Node q = pre.next;
while (q != null) {
if (q.data == n) {
pre.next = q.next;
q = q.next;
break;
} else {
pre = q;
q = q.next;
}
}
}
// 删除所有data=n的节点
public void deleteAll(int n) {
if (head.data == n) {
head = head.next;
}
Node pre = head;
Node q = pre.next;
while (q != null) {
if (q.data == n) {
pre.next = q.next;
q = q.next;
} else {
pre = q;
q = q.next;
}
}
}
public void depul() {
Node p = head;
Node pre;
Node q;
int da;
while (p != null) {
da = p.data;
q = p.next;
pre = p;
while (q != null) {
if (q.data == da) {
pre.next = q.next;
q = q.next;
} else {
pre = q;
q = q.next;
}
}
p = p.next;
}
}
public void sort() {
Node p = head;
Node q;
int tmp;
while (p != null) {
q = p.next;
while (q != null) {
if (p.data > q.data) {
tmp = p.data;
p.data = q.data;
q.data = tmp;
}
q = q.next;
}
p = p.next;
}
}
public void reverse() {
Node tmp;
Node p = head;
Node q = p.next;
while (q != null) {
tmp = q.next;
q.next = p;
p = q;
q = tmp;
}
head.next = null;
head = p;
}
// 指定位置插入节点,插入在第n个节点之后
public void insert(int loc, int data) {
if (loc < 0) {
System.out.println("loc 必须是大于或等于 0");
return;
} else {
if (loc == 0) {
// 插在头部
Node newNode = new Node(data);
newNode.next = head;
head = newNode;
} else {
Node p = head;
Node pre = null;
int n = 0;
while (p != null) {
if (n == loc) {
Node newNode = new Node(data);
pre.next = newNode;
newNode.next = p;
break;
}
n++;
pre = p;
p = p.next;
}
if(loc > this.length()){
//当loc大于链表长度时插在末尾;
pre.next = new Node(data);
}
}
}
}
// 返回链表长度
public int length() {
int len = 0;
Node p = head;
while (p != null) {
len++;
p = p.next;
}
return len;
}
public static void main(String[] args) {
int[] arr = { 1, 5, 6, 6, 6, 5, 8, 9, 7, 9, 0, 0, 0, 0, 10, 1 };
SingleLinkedList list = new SingleLinkedList();
SingleLinkedList list2 = new SingleLinkedList();
for (int i : arr) {
list.addHeadNode(i);
list2.addTailNode(i);
}
System.out.println("原始长度:" + list.length());
System.out.println("原始链表初始化(addTailNode):");
list2.mp();
System.out.println("\n原始链表初始化(addHeadNode):");
list.mp();
System.out.println("\nsort():");
list.sort();
list.mp();
System.out.println("\ndeleteOne(6):");
list.deleteOne(6);
list.mp();
System.out.println("\ndeleteAll(1):");
list.deleteAll(1);
list.mp();
System.out.println("\nreverse():");
list.reverse();
list.mp();
System.out.println("\ndepul():");
list.depul();
list.mp();
System.out.println("\ninsert(1,999):");
list.insert(3, 999);
list.mp();
}
}
Output:
原始长度:16
原始链表初始化(addTailNode):
1,5,6,6,6,5,8,9,7,9,0,0,0,0,10,1,
原始链表初始化(addHeadNode):
1,10,0,0,0,0,9,7,9,8,5,6,6,6,5,1,
sort():
0,0,0,0,1,1,5,5,6,6,6,7,8,9,9,10,
deleteOne(6):
0,0,0,0,1,1,5,5,6,6,7,8,9,9,10,
deleteAll(1):
0,0,0,0,5,5,6,6,7,8,9,9,10,
reverse():
10,9,9,8,7,6,6,5,5,0,0,0,0,
depul():
10,9,8,7,6,5,0,
insert(1,999):
10,9,8,999,7,6,5,0,