package 线性表双向循环链表结构及其功能实现; /*优化了下 插入方法,选择的应该是第几个空位插入,双向循环链表,能够正逆两个方向显示数据 * * * * * * */ public class DoubleCircularLinkedList { class ListNode { int data; ListNode prev;//指向前驱 ListNode next;//指向后继 public ListNode(int data) { this.data = data; } }
ListNode head;
ListNode tail;
int size = 0;
DoubleCircularLinkedList() {
head = null;// (头指针)指向第一个元素的地址
tail = null;// (尾指针)//指向最后一个元素的地址
}
// 添加元素(尾插法)
public void append(int data) {
ListNode newNode = new ListNode(data);
if (tail == null) {
head = newNode;
newNode.next = head;
tail = newNode;
size++;
} else {
tail.next = newNode;
newNode.prev=tail;
tail = newNode;
newNode.next = head;
size++;
}
}
// 正序遍历并显示
public void display1() {
ListNode p = head;
while (p.next != head) {
System.out.print(p.data + " ");
p = p.next;
}
System.out.print(p.data);
System.out.println();
}
//逆序遍历并显示
public void display2() {
ListNode p=tail;
while(p!=head) {
System.out.print(p.data + " ");
p=p.prev;
}
System.out.print(p.data);
System.out.println();
}
public static void main(String args[]) {
DoubleCircularLinkedList newlist = new DoubleCircularLinkedList();
newlist.append(1);
newlist.append(2);
newlist.append(5);
newlist.append(3);
newlist.insert(1, 6);
newlist.display1();
newlist.delete(2);
newlist.display2();
}
// 插入元素
public void insert(int position, int num) {
ListNode p = new ListNode(num);
if (position > size) {// 1 越界
System.out.println("超出链表长度,无效");
} else if (position <= size-1) {// 2 中间插入
ListNode now = head;
for (int i = 1; i < position; i++) {// 找到插入空位的前一个元素位置
now = now.next;
}
now.next.prev=p;
p.next=now.next;
p.prev=now;
now.next=p;
size++;
}
}
// 删除元素
public void delete(int position) {
if (position > size) {// 1 越界
System.out.println("超出链表长度,无效");
} else if (position == 1) {
head.next=null;
head=head.next;
head.prev=null;
tail.next=head;
size--;
} else if (position == size) {
ListNode now = tail.prev;
tail.next=null;
tail.prev=null;
tail=now;
now.next=head;
size--;
}
else {
ListNode pre = head;//删除结点的前一个
ListNode cur;//删除结点的后一个
for (int i = 1; i < position - 1; i++) {//删除元素的前一个
pre = pre.next;
}
cur=pre.next.next;//删除结点的后一个
pre.next=cur;
cur.prev=pre;
size--;
}
}
}
|