关于链表的四道算法题
解决链表的四道算法题:
1.链表反转。
2.使用快慢指针获取链表中间值。
3.使用快慢指针判断链表中是否有环。
4.使用快慢指针找出链表中环的入口。
1.链表反转
使用递归解决链表反转
/*
*路人假helloWorld
*反转链表
*/
public void reverse(Node head){
if(head.next == null){
return;
}
reverse(head.next);
}
//反转指定结点curr,并把反转的结点返回
public Node reverse(Node curr){
if (curr.next == null){
head.next = curr;
return curr;
}
Node pre = reverse(curr.next);
pre.next = curr;
curr.next = null;
return curr;
}
2.使用快慢指针取链表中间值
/*
*路人假helloWorld
*/
public String getMid(Node first){
Node<String> fast = first;
Node<String> slow = first;
while(fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
}
return slow.item;
}
3.使用快慢指针判断链表是否有环
快指针每次走两步,慢指针每次走一步。如果它们能相遇,则代表链表中存在环;否则链表中不存在环。
/*
*路人假helloworld
*/
public boolean isCircle(Node<String> first){
Node<String> fast = first;
Node<String> slow = first;
while(fast.next != null && fast.next.next != null){
fast = fast.next.next;
slow = slow.next;
if (fast.item.equals(slow.item)){
return true;
}
}
return false;
}
2.6 使用快慢指针找出链表中环的入口
当快慢指针相遇时, 我们可以判断到链表中有环,这时重新设定一个 新指针指向链表的起点,且步长与慢指针一样为1 , 则慢指针
与新指针相遇的地方就是环的入口。证明这一结论牵涉到数论的知识 。
public static Node<String> isCircle(Node<String> first){
Node<String> fast = first;
Node<String> slow = first;
Node<String> temp = null;
while(fast.next != null && fast.next.next != null) {
fast = fast.next.next;
slow = slow.next;
if (fast.item.equals(slow.item)){
temp = first;
continue;
}
if (temp != null){
temp = temp.next;
if (temp.item.equals(slow.item)){
break;
}
}
}
return temp;
}

浙公网安备 33010602011771号