package doublelinklist;
public class Node {
int item;
Node pre;
Node next;
public Node(int item) {
this.item = item;
this.pre = null;
this.next = null;
}
}
package doublelinklist;
public class DoubleLinkList {
Node head;
public DoubleLinkList() {
}
public DoubleLinkList(Node head) {
this.head = head;
}
// 链表是否为空
public static boolean is_empty(Node head) {
return head == null ? true : false;
}
// 链表长度
public static int length(Node head) {
if (is_empty(head)) {
return 0;
}
int length = 1;
Node cur = head;
while (cur.next != null) {
length++;
cur = cur.next;
}
return length;
}
// 遍历整个链表
public static void travel(Node head) {
Node cur = head;
System.out.println("链表遍历开始!!");
while (cur != null) {
System.out.print(cur.item + " ");
cur = cur.next;
}
System.out.println("\n链表遍历结束!!");
}
// 链表头部添加元素
public static void add(DoubleLinkList list, int item) {
Node node = new Node(item);
if (is_empty(list.head)) {
list.head = node;
} else {
node.next = list.head;
list.head.pre = node;
list.head = node;
}
}
// 链表尾部添加元素
public static void append(DoubleLinkList list, int item) {
Node node = new Node(item);
if (is_empty(list.head)) {
list.head = node;
} else {
Node cur = list.head;
while (cur.next != null) {
cur = cur.next;
}
cur.next = node;
node.pre = cur;
}
}
// 指定位置添加元素
public static void insert(DoubleLinkList list, int pos, int item) {
if (pos <= 0) {
add(list, item);
} else if (pos >= length(list.head)) {
append(list, item);
} else {
Node node = new Node(item);
Node pre = list.head;
for (int i = 0; i < pos - 1; i++) {
pre = pre.next;
}
node.pre = pre;
node.next = pre.next;
pre.next.pre = node;
pre.next = node;
}
}
// 删除节点
public static void remove(DoubleLinkList list, int item) {
Node cur = list.head;
while (cur != null) {
if (cur.item == item) {
// 头结点的删除
if (cur == list.head) {
list.head = cur.next;
if (cur.next != null) {
cur.next.pre = null;
}
} else {
// 中间结点和尾结点的删除
cur.pre.next = cur.next;
if(cur.next!=null){
cur.next.pre = cur.pre;
}
}
break;
} else {
cur = cur.next;
}
}
}
// 查找节点是否存在
public static boolean search(Node head, int item) {
Node cur = head;
while (cur != null) {
if (cur.item == item) {
return true;
} else {
cur = cur.next;
}
}
return false;
}
}
package doublelinklist;
public class DoubleLinkListTest {
public static void main(String[] args) {
Node head = new Node(100);
DoubleLinkList list = new DoubleLinkList(head);
if (DoubleLinkList.is_empty(list.head)) {
System.out.println("链表为空,添加元素麻利的~");
System.out
.println("************************************************");
System.out.println("链表的长度为:" + DoubleLinkList.length(list.head));
DoubleLinkList.travel(list.head);
System.out
.println("************************************************");
System.out.println("头部插入节点");
DoubleLinkList.add(list, 10);
DoubleLinkList.add(list, 20);
DoubleLinkList.add(list, 30);
DoubleLinkList.add(list, 15);
DoubleLinkList.add(list, 25);
System.out.println("链表的长度为:" + DoubleLinkList.length(list.head));
DoubleLinkList.travel(list.head);
System.out
.println("************************************************");
System.out.println("尾部插入几个节点");
DoubleLinkList.append(list, 100);
DoubleLinkList.append(list, 200);
DoubleLinkList.append(list, 500);
DoubleLinkList.append(list, 400);
DoubleLinkList.append(list, 300);
System.out.println("链表的长度为:" + DoubleLinkList.length(list.head));
DoubleLinkList.travel(list.head);
System.out
.println("************************************************");
DoubleLinkList.insert(list, 1, 77);
DoubleLinkList.insert(list, 0, 88);
DoubleLinkList.insert(list, DoubleLinkList.length(list.head) - 1,
66);
DoubleLinkList.insert(list, DoubleLinkList.length(list.head), 55);
DoubleLinkList.insert(list, 5, 44);
System.out.println("链表的长度为:" + DoubleLinkList.length(list.head));
DoubleLinkList.travel(list.head);
System.out.println("节点搜索:" + DoubleLinkList.search(list.head, 88));
System.out.println("节点搜索:" + DoubleLinkList.search(list.head, 55));
System.out.println("节点搜索:" + DoubleLinkList.search(list.head, 300));
System.out.println("节点搜索:" + DoubleLinkList.search(list.head, 100));
System.out.println("节点搜索:" + DoubleLinkList.search(list.head, 5));
System.out
.println("************************************************");
System.out.println("删除几个节点试试....");
DoubleLinkList.remove(list, 88);
DoubleLinkList.remove(list, 55);
DoubleLinkList.remove(list, 300);
DoubleLinkList.remove(list, 44);
DoubleLinkList.remove(list, 25);
System.out.println("链表的长度为:" + DoubleLinkList.length(list.head));
DoubleLinkList.travel(list.head);
} else {
System.out.println("链表的长度为:" + DoubleLinkList.length(list.head));
DoubleLinkList.travel(list.head);
System.out
.println("************************************************");
System.out.println("头部插入节点");
DoubleLinkList.add(list, 10);
DoubleLinkList.add(list, 20);
DoubleLinkList.add(list, 30);
DoubleLinkList.add(list, 15);
DoubleLinkList.add(list, 25);
System.out.println("链表的长度为:" + DoubleLinkList.length(list.head));
DoubleLinkList.travel(list.head);
System.out
.println("************************************************");
System.out.println("尾部插入几个节点");
DoubleLinkList.append(list, 100);
DoubleLinkList.append(list, 200);
DoubleLinkList.append(list, 500);
DoubleLinkList.append(list, 400);
DoubleLinkList.append(list, 300);
System.out.println("链表的长度为:" + DoubleLinkList.length(list.head));
DoubleLinkList.travel(list.head);
System.out
.println("************************************************");
DoubleLinkList.insert(list, 1, 77);
DoubleLinkList.insert(list, 0, 88);
DoubleLinkList.insert(list, DoubleLinkList.length(list.head) - 1,
66);
DoubleLinkList.insert(list, DoubleLinkList.length(list.head), 55);
DoubleLinkList.insert(list, 5, 44);
System.out.println("链表的长度为:" + DoubleLinkList.length(list.head));
DoubleLinkList.travel(list.head);
System.out.println("节点搜索:" + DoubleLinkList.search(list.head, 88));
System.out.println("节点搜索:" + DoubleLinkList.search(list.head, 55));
System.out.println("节点搜索:" + DoubleLinkList.search(list.head, 300));
System.out.println("节点搜索:" + DoubleLinkList.search(list.head, 100));
System.out.println("节点搜索:" + DoubleLinkList.search(list.head, 5));
System.out
.println("************************************************");
System.out.println("删除几个节点试试....");
DoubleLinkList.remove(list, 88);
DoubleLinkList.remove(list, 55);
DoubleLinkList.remove(list, 300);
DoubleLinkList.remove(list, 44);
DoubleLinkList.remove(list, 25);
System.out.println("链表的长度为:" + DoubleLinkList.length(list.head));
DoubleLinkList.travel(list.head);
System.out.println(DoubleLinkList.search(list.head, 15));
}
}
}