关于链表的四道算法题

解决链表的四道算法题:
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;
    }
posted @ 2022-03-19 16:26  路人假helloWorld  阅读(53)  评论(0)    收藏  举报