package LinkedList;
public class JosepfuLinkedListDemo {
//测试一把
public static void main(String[] args) {
CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList();
circleSingleLinkedList.add(5);
circleSingleLinkedList.list();
//测试一把出节点
circleSingleLinkedList.pop(1,2,5);
}
}
//创建一个环形的单行链表
class CircleSingleLinkedList {
//创建一个first节点,当前没有编号
private ListNode first = null;
//添加节点,构成环形链表
public void add(int nums) {
if (nums < 1) {
System.out.println("nums值不正确");
return;
}
ListNode curr = null; //辅助变量,帮助构建环形链表
//使用for循环来创建环形链表
for (int i = 1; i <= nums; i++) {
//根据编号,创建节点
ListNode listNode = new ListNode(i);
//如果是第一个节点
if (i == 1) {
first = listNode;
first.setNext(first);//构成一个环
curr = first;
} else {
curr.setNext(listNode);
listNode.setNext(first);
curr = listNode;
}
}
}
//遍历当前的环形链表
public void list() {
//判断是否为空
if (first == null) {
System.out.println("没有节点");
return;
}
ListNode curr = first;
while (true) {
System.out.print("编号");
System.out.println(curr.getNo());
curr = curr.getNext();
if (curr == first) {
break;
}
}
}
//根据用户的输入计算出圈的节点顺序
//startNo:从第几个结点开始
//countNum:数几个节点后开始出
//一共有多少个节点
public void pop(int startNo, int countNum, int nums) {
//先对数据校验
if (first == null || startNo < 1 || startNo > nums) {
System.out.println("参数输入有问题!!!!!!!!");
return;
}
//辅助指针,是helper指向最后一个节点
ListNode helper = first;
while(true){
if(helper.getNext() == first){ //helper指向了最后一个节点
break;
}
helper = helper.getNext();
}
//将helper和first移动到初始位置 根据startNo
for (int i = 0; i < startNo - 1; i++) {
helper = helper.getNext();
first = first.getNext();
}
while(true){
if(helper == first){ //只剩下一个节点了
break;
}
for (int i = 0; i < countNum - 1; i++) {
helper = helper.getNext();
first = first.getNext(); // first就是要出去的节点
}
System.out.print("编号");
System.out.println(first.getNo());
//删除节点
first = first.getNext();
helper.setNext(first);
}
System.out.println("最后剩下的是");
System.out.println(first.getNo());
}
}
//创建一个节点类
class ListNode {
private int no;
private ListNode next;
public ListNode(int no) {
this.no = no;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public ListNode getNext() {
return next;
}
public void setNext(ListNode next) {
this.next = next;
}
}
环形链表(Java代码实现)
最新推荐文章于 2024-03-15 20:16:04 发布