- 定义两个指针pre,cur分别表示前一个人和当前人
- 先将其指向到开始位置
- 将pre和cur同时向后移动m次,到达要移出得位置
- 将pre的next指向cur的next,cur指向cur的next
- 直到pre等于cur结束(代码中first就是这里的cur)
public class Joseph { public static void main(String[] args) { CirclelinkedList circlelinkedList = new CirclelinkedList(); circlelinkedList.add(5); circlelinkedList.print(); System.out.println("出圈顺序为:"); circlelinkedList.outOfCircle(1, 2, 5); } } //环形链表 class CirclelinkedList { //环形链表的第一个节点 private Boy first; public void add(int nums) { //判断添加的节点个数大于0 if (nums < 1) { return; } //temp表示最后一个节点 Boy temp = null; //循环添加 for (int i = 1; i <= nums; i++) { Boy boy = new Boy(i); if (i == 1) { first = boy; first.setNext(boy); temp = first; } else { //将添加的节点链接到最后一个节点的后面 temp.setNext(boy); //将新添加的节点与第一个节点相连 boy.setNext(first); //temp后移,指向最新节点 temp = boy; } } } //遍历链表,打印 public void print() { if (first == null) { System.out.println("链表为空~~"); return; } Boy temp = first; while (true) { System.out.println(temp); if (temp.getNext() == first) { break; } temp = temp.getNext(); } } public void outOfCircle(int startNo, int interval, int nums) { //判断参数是否合理 if (first == null) { System.out.println("链表为空"); return; } if (startNo > nums || startNo < 1 || interval < 1) { System.out.println("参数不合理"); return; } //第一个的前一个节点,在移出该节点时使用 Boy pre = first; while (pre.getNext() != first) { pre = pre.getNext(); } //移动到开始位置 while (true) { if (first.getNo() == startNo) { break; } first = first.getNext(); pre = pre.getNext(); } //进行出圈操作 while (true) { if (pre == first) { //说明圈内只剩下一个节点 break; } //循环interval - 1次,找到需要出圈的节点 for (int i = 0; i < interval - 1; i++) { first = first.getNext(); pre = pre.getNext(); } System.out.println("出圈的节点为:" + first); //移出该节点 //1.设置上一个节点的next指向first节点的下一个节点 pre.setNext(first.getNext()); //2.将first向后移动 first = first.getNext(); } System.out.println("最后的节点为:" + first); } } //节点 class Boy { private int no; private Boy next; public Boy(int no) { this.no = no; } @Override public String toString() { return "Boy{" + "no=" + no + '}'; } public int getNo() { return no; } public void setNo(int no) { this.no = no; } public Boy getNext() { return next; } public void setNext(Boy next) { this.next = next; } }运行结果:
从B站韩顺平老师的Java数据结构与算法习得。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)