前奏
链表的特点:各个相依节点的地址空间不一定是连续的,这样就充分了历用了内存中的碎片内容存
约束夫小述
Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓。
于是决定了自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀。
然后下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,
Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏
双向链表代码(不带头结点)
class DoubleLinked {
DoubleLinkedNode headNode=new DoubleLinkedNode(null);
public void showNode(){
DoubleLinkedNode currNode=headNode;
while(currNode.nextNode!=null){
System.out.println(currNode.nextNode.currData+"====向上"+currNode.nextNode.preNode.currData+"===向下"+currNode.nextNode.nextNode.currData);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
currNode=currNode.nextNode;
}
}
public void addNodeOrderBy(Object value){
DoubleLinkedNode currNode=headNode;
DoubleLinkedNode temp=null;
DoubleLinkedNode newNode=new DoubleLinkedNode(value);
while(currNode.nextNode!=null){
temp=currNode.nextNode;
if((Integer)temp.currData>(Integer) value){
break;
}
currNode=temp;
if(currNode.nextNode==headNode.nextNode){
break;
}
}
if(currNode.nextNode==null){
newNode.preNode=newNode;
newNode.nextNode=newNode;
currNode.nextNode=newNode;
}
else if(currNode==headNode){
DoubleLinkedNode lastNode=headNode;
while(lastNode.nextNode!=null){
lastNode=lastNode.nextNode;
if(lastNode.nextNode==headNode.nextNode){
break;
}
}
newNode.preNode=lastNode;
newNode.nextNode=currNode.nextNode;
currNode.nextNode.preNode=newNode;
currNode.nextNode=newNode;
lastNode.nextNode=newNode;
}
else if(currNode.nextNode==headNode.nextNode){
newNode.preNode=currNode;
newNode.nextNode=currNode.nextNode;
currNode.nextNode=newNode;
headNode.nextNode.preNode=newNode;
}
else{
newNode.preNode=currNode;
newNode.nextNode=currNode.nextNode;
currNode.nextNode.preNode=newNode;
currNode.nextNode=newNode;
}
}
}
class DoubleLinkedNode{
public DoubleLinkedNode preNode;
public DoubleLinkedNode nextNode;
public Object currData;
public DoubleLinkedNode(Object data){
this.currData=data;
}
}
约瑟夫代码实现(配合双向循环链表)
public class PracticeJoseph {
public static void main(String[] args) {
int numberCount=0;
int number=41;
DoubleLinked link=new DoubleLinked();
for(int index=1;index<=number;index++){
link.addNodeOrderBy(index);
}
DoubleLinkedNode currNode=link.headNode;
while(currNode.nextNode!=null){
DoubleLinkedNode temp=currNode.nextNode;
numberCount++;
if(numberCount==3){
if(number--<3){
break;
}
System.out.println(temp.currData);
if(temp.nextNode==temp){
break;
}else if(temp==link.headNode.nextNode){
DoubleLinkedNode lastNode=link.headNode;
while(lastNode.nextNode!=null){
lastNode=lastNode.nextNode;
if(lastNode.nextNode==link.headNode.nextNode){
break;
}
}
lastNode.nextNode=temp.nextNode;
temp.nextNode.preNode=lastNode;
link.headNode.nextNode=temp.nextNode;
}else
{
currNode.nextNode=temp.nextNode;
temp.nextNode.preNode=currNode;
}
numberCount=0;
}
currNode=temp;
}
}
}
单向链表代码(不带头结点)
class SingleLoopLinkedDemo{
public static void main(String[] args) {
SingleLoopLinked singleLinekd2=new SingleLoopLinked();
System.out.println("链表的有效个数"+singleLinekd2.getLinkedValidNumber());
singleLinekd2.getBottomNode(0);
int count=0;
MyNode2 currNode=singleLinekd2.headNode;
while(true){
currNode=currNode.nextNode;
count++;
if(count%3==0){
count=0;
System.out.println(currNode.obj.toString());
singleLinekd2.deleteNode(currNode.obj);
if(singleLinekd2.headNode.nextNode==null) break;
}
}
}
}
class SingleLoopLinked{
public MyNode2 headNode=new MyNode2();
public Integer getLinkedValidNumber(){
MyNode2 currNode=headNode;
Integer coutNumber=0;
while(currNode.nextNode!=null){
coutNumber++;
currNode=currNode.nextNode;
if(currNode.nextNode==headNode.nextNode)break;
}
return coutNumber;
}
public void getBottomNode(Integer bottomNumber){
MyNode2 currNode=headNode;
if(currNode.nextNode!=null){
for(int index=0;index<=(getLinkedValidNumber()-bottomNumber);index++){
currNode=currNode.nextNode;
}
System.out.println("整个链表的倒数"+bottomNumber+"个值内容为"+currNode.obj.toString());
}
System.out.println("没有");
}
public void addNode(Object value){
MyNode2 newNode=new MyNode2(value);
MyNode2 currNode=headNode;
MyNode2 temp=null;
while(currNode.nextNode!=null){
temp=currNode.nextNode;
if((Integer)temp.obj>(Integer) value){
break;
}
currNode=temp;
if(currNode.nextNode==headNode.nextNode)break;
}
if(currNode.nextNode==null){
newNode.nextNode=newNode;
currNode.nextNode=newNode;
}
else if(currNode==headNode){
MyNode2 lastNode=headNode;
while(lastNode.nextNode!=null){
lastNode=lastNode.nextNode;
if(lastNode.nextNode==headNode.nextNode)break;
}
newNode.nextNode=lastNode.nextNode;
lastNode.nextNode=newNode;
currNode.nextNode=newNode;
}else{
newNode.nextNode=currNode.nextNode;
currNode.nextNode=newNode;
}
}
public void deleteNode(Object obj){
MyNode2 currNode=headNode;
MyNode2 temp=null;
while(currNode.nextNode!=null){
temp=currNode.nextNode;
if(temp.obj.equals(obj)){
if(temp==headNode.nextNode){
if(temp.nextNode==temp) {
headNode.nextNode=null;
break;
}
MyNode2 lastNode=headNode;
while(lastNode.nextNode!=null){
lastNode=lastNode.nextNode;
if(lastNode.nextNode==headNode.nextNode)break;
}
lastNode.nextNode=temp.nextNode;
currNode.nextNode=temp.nextNode;
}else{
currNode.nextNode=temp.nextNode;
}
break;
}
currNode=temp;
if(currNode.nextNode==headNode.nextNode)break;
}
}
public void showNode(){
MyNode2 currNode=headNode;
while(currNode.nextNode!=null){
System.out.println(currNode.nextNode);
try {
Thread.sleep(400);
} catch (InterruptedException e) {
e.printStackTrace();
}
currNode=currNode.nextNode;
}
System.out.println("当前链表没有内容");
}
}
class MyNode2{
public Object obj;
public MyNode2 preNode;
public MyNode2 nextNode;
public MyNode2(){}
public MyNode2(Object obj){
this.obj=obj;
}
@Override
public String toString() {
return ("当前节点内容:"+obj+"下一个节点:"+(nextNode==null?"空":""+nextNode.obj)+"上一个节点"+(preNode==null?"空":""+preNode.obj));
}
}
结果