链表反转 代码:
public void reverse(){
if(isEmpty()){
return;
}
reverse(head.next);
}
private Node reverse(Node cur){
if(cur.next == null){
head.next = cur;
return cur;
}
Node reverse = reverse(cur.next);
reverse.next = cur;
cur.next = null;
return cur;
}
快慢指针
1、中间值问题
代码:
public T getMid() {
if (isEmpty()) {
return null;
}
Node slow = head;
Node fast = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow.data;
}
2、单向链表是否有环问题
代码:
public boolean isCircle(){
if (isEmpty()) {
return false;
}
Node slow = head;
Node fast = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if(slow==fast){
return true;
}
}
return false;
}
3、有环链表的环入口问题
代码:
public T getCircleEntry(){
if(isEmpty()){
return null;
}
Node slow = head;
Node fast = head;
Node temp = null;
while (fast != null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
if(slow==fast){
temp = head;
}
if(temp != null){
temp = temp.next;
if (temp==slow){
break;
}
}
}
return slow.data;
}
4、循环链表-约瑟夫问题
public void testYSFquetion() {
Node<Integer> first = null;
Node<Integer> pre = null;
for (int i = 1; i <= 41; i++) {
if (i == 1) {
first = new Node(i, null);
pre = first;
}
Node<Integer> newNode = new Node<>(i, null);
pre.next = newNode;
pre = newNode;
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.println(n.data + ",");
count = 0;
n = n.next;
} else {
before = n;
n = n.next;
}
}
System.out.println(n.data);
}
private class Node<T> {
private T data;
private Node next;
public Node(T data, Node next) {
this.data = data;
this.next = next;
}
}