package 线性表循环链表结构及功能实现;
/*链表基本功能已经实现,基本上基于单链表来实现的。循环链表的特殊性,让它在遍历时最后一个数据必须单独
* 显示。
* 既然方法名字叫做插入,那肯定是在两个数字之间,那头尾指针都不会因为插入操作而改变,
* 所以链表的循环不会发生错误。
* 删除那里考虑的要全面一点。
* 其他的基本上就是单链表的内容了
*
*
*
*
*
*/
public class CircularLinkedList {
class ListNode {
int data;
ListNode next;
public ListNode(int data) {
this.data = data;
}
}
ListNode head;
ListNode tail;
int size = 0;
CircularLinkedList() {
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;
tail = newNode;
newNode.next = head;
size++;
}
}
// 遍历并显示
public void display() {
ListNode p = head;
while (p.next != head) {
System.out.print(p.data + " ");
p = p.next;
}
System.out.print(p.data);
System.out.println();
}
public static void main(String args[]) {
CircularLinkedList newlist = new CircularLinkedList();
newlist.append(1);
newlist.append(2);
newlist.display();
newlist.insert(2, 3);
newlist.display();
newlist.delete(2);
newlist.display();
}
// 插入元素
public void insert(int position, int num) {
ListNode p = new ListNode(num);
if (position > size) {// 1 越界
System.out.println("超出链表长度,无效");
} else if (position <= size) {// 2 中间插入
ListNode now = head;
for (int i = 1; i < position - 1; i++) {// 遍历到倒数第二个
now = now.next;
}
p.next = now.next;
now.next = p;
size++;
}
}
// 删除元素
public void delete(int position) {
if (position > size) {// 1 越界
System.out.println("超出链表长度,无效");
} else if (position == 1) {
head=head.next;
tail.next=head;
size--;
} else if (position == size) {
ListNode now = head;
for (int i = 1; i < position - 1; i++) {
now = now.next;
}
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=pre.next.next;
size--;
}
}
}
数据结构线性表之循环链表结构代码及其部分功能实现
最新推荐文章于 2021-12-10 14:46:40 发布