前几天去佳龙面试 有一道算法题
用双链表解决约瑟夫环问题
当时是和两个朋友一块去的 他们看完题直接走了 其实我是不想走的 但是从众心理太强
我也走了 后天周一 我要再去一趟哪里
其实我当时也不知道什么是约瑟夫环 就走了 而且面试的人态度很不好
这里是实现
class DoubleNode {
public DoubleNode pre ;
public DoubleNode next;
public int data;
public DoubleNode(int data) {
this.data=data;
pre=this;
next=this;
}
}
class DoubleList{
public DoubleNode first;
public DoubleNode last;
public int size;
// 初始化
public DoubleList(DoubleNode dn) {
first = dn;
last= dn;
size=1;
}
// 添加节点
public void addNode(DoubleNode node){
last.next = node;
node.pre=last;
node.next=first;
last = node;
++size;
}
//删除节点
public void removeNode(int data){
//如果删除的是第一个node
DoubleNode current = first;
if(data==first.data){
last.next=first.next;
first.next.pre=first.pre;
System.out.println("删除掉了"+first.data);
first=first.next;
size--;
return;
}
if(data==last.data){
last.pre.next=first;
first.pre=last.pre;
System.out.println("删除掉了"+last.data);
last=last.pre;
size--;
return;
}
for (int i = 0; i < size; i++) {
if(current.data != data){
current = current.next;
}else {
current.pre.next=current.next;
current.next.pre=current.pre;
System.out.println("删除掉了"+current.data);
size--;
return;
}
}
}
public void displayList(){
DoubleNode current = first;
for (int i = 0; i <size ; i++) {
System.out.println(current.data);
current = current.next;
}
}
}
上面是构造一个双链表结构
public class TestDoubleNode{
public static void main(String[] args){
yusefu(3,2);
}
/**
* @param k
* @param m
*/
public static void yusefu(int k,int m){
DoubleList dl = new DoubleList(new DoubleNode(1));
for (int i = 2; i < 6; i++) {
DoubleNode db = new DoubleNode(i);
dl.addNode(db);
}
DoubleNode current = dl.first;
for (int i = 0; i < k-1; i++) {
current = current.next;
}
while (dl.size!=1){
// 铲除数到m的人
DoubleNode firstCall = current;
DoubleNode killNode = null;
for (int i = 1; i < m ; i++) {
killNode = firstCall.next;
}
dl.removeNode(killNode.data);
if(dl.size==1){
break;
}
current = killNode.next;
}
dl.displayList();
}
}
其实很简单 只是大学没怎么学数据结构 气人哪