1. 单向链表反转:查看4.2节
2. 查找链表的中间值
// 通过快慢指针,按照1:2的比例,找到中间结点
public static String getMid(Node<String> first){
Node slow=first;
Node fast=first;
while (fast!=null && fast.next!=null){
fast=fast.next.next;
slow=slow.next;
}
return (String) slow.item;
}
3.判断链表中是否有环
/**
* 判断链表中是否有环
* @param first 链表首结点
* @return ture为有环,false为无环
* 通过快慢指针,如果有环,一定会相遇
*/
public static boolean isCircle(Node<String> first) {
Node<String> slow = first;
Node<String> fast = first;
while(fast!=null && fast.next!=null) {
fast = fast.next.next;
slow = slow.next;
if(fast.equals(slow)){
return true;
}
}
return false;
}
4.查找有环链表中环的入口结点
/** 当快慢指针相遇时,我们可以判断到链表中有环,这时重新设定一个新指针指向链表的起点,且步长与慢指针一样为1,则慢指针与“新”指针相遇的地方就是环的入口。*/
public static Node getEntrance(Node<String> first) {
Node<String> slow = first;
Node<String> fast = first;
Node<String> temp = null;
while(fast!=null && fast.next!=null){
fast = fast.next.next;
slow=slow.next;
if (fast.equals(slow)){
temp = first;
continue;
}
if (temp!=null){
temp=temp.next;
if (temp.equals(slow)){
return temp;
}
}
}
return null;
}
5.约瑟夫问题
/**
* 传说有这样一个故事,在罗马人占领乔塔帕特后,39 个犹太人与约瑟夫及他的朋友躲到一个洞中,39个犹太人决
* 定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,第一个人从1开始报数,依次往
* 后,如果有人报数到3,那么这个人就必须自杀,然后再由他的下一个人重新从1开始报数,直到所有人都自杀身亡
* 为止。然而约瑟夫和他的朋友并不想遵从。于是,约瑟夫要他的朋友先假装遵从,他将朋友与自己安排在第16个与
* 第31个位置,从而逃过了这场死亡游戏 。
*/
Node first = null;
//记录前一个结点
Node<Integer> pre = null;
for (int i = 1; i < 42; i++) {
if (i == 1) {
first = new Node(1, null);
pre = first;
continue;
}
Node node = new Node(i, null);
pre.next = node;
pre = pre.next;
if (i == 41) {
pre.next = first;
}
}
int count = 0;
Node<Integer> n = first;
// 记录被删除的前一个结点
Node<Integer> before = null;
while (n != n.next) {
count++;
if (count == 3) {
before.next=n.next;
System.out.print(n.item+",");
count=0;
n=n.next;
} else {
before = n;
n = n.next;
}
}
System.out.println(n.item);
}
// 打印结果: 3,6,9,12,15,18,21,24,27,30,33,36,39,1,5,10,14,19,23,28,32,37,41,7,13,20,26,34,40,8,17,29,38,11,25,2,22,4,35,16,31