package com.dby.link;
/**
* Created by suzunshou on 2016/4/11.
* 链表的元素不能随机访问
* 元素前面和后面不会出现多个元素相连的情况
* 元素相互依赖,串联而成
* 链表只有一个表头
* 循环链表首尾相连,尾结点指向首结点
*/
public class LinkedList {
//结点类
private class Node {
//数据
private Object data;
//下一个结点的地址
private Node next = null;
public Node(Object data) {
this.data = data;
}
}
private Node first = null;
private Node last = null;
private int size;
//循环链表,头尾相连,插入结点到某个位置
public void insert(Object data, int index) {
//新结点
Node newNode = new Node(data);
//空链表
if (first == null) {
first = newNode;
first.next = first;
return;
}
//只有一个结点
if (index - 1 == 0) {
newNode.next = first.next;
first.next = newNode;
return;
}
//普通情况
Node curr = first.next;
int count = 0;
//遍历直到起始位置
while (curr != first && count < index - 2) {
curr = curr.next;
count++;
}
//插入结点,把前一个结点和后一个结点断开,两端接上新结点
if (count == index - 2) {
newNode.next = curr.next;
curr.next = newNode;
}
if (newNode == first.next) {
first = newNode;
}
size++;
}
//输出约瑟夫环被删除的元素,报数m
public void output_josephus(int m) {
//首结点
Node curr = first;
//遍历返回到起始点
while (curr.next != curr) {
//找到m索引处的结点
for (int i = 1; i < m; i++) {
curr = curr.next;
}
//找到被删除的结点
Node del = curr.next;
//输出结点值
System.out.println(del.data);
//断开被删除结点,连接被删结点的下一个结点
curr.next = curr.next.next;
//删除结点
del = null;
}
//输出并删除最后一个结点
System.out.println(curr.data);
curr = null;
}
public static void main(String[] args) {
LinkedList ll = new LinkedList();
for (int i = 1; i < 8; i++) {
ll.insert(i, i);
}
ll.output_josephus(2);
}
}
数据结构之循环链表
最新推荐文章于 2024-07-06 13:49:17 发布