面试时链表解题方法论
(1)对于笔试,不用太在乎空间复杂度,一切为了时间复杂度
(2)对于面试,时间复杂度依然放第一位,但是一定要找到最省空间的办法
面试题:快慢指针
(1)输入链表头结点,奇数长度返回中点,偶数长度返回上中点(中点左边的值)
(2)输入链表头结点,奇数长度返回中点,偶数长度返回下中点
(3)输入链表头结点,奇数长度返回中点前一个,偶数长度返回中点前一个
package com.inspire.chapter6;
public class Code01_LinkedListMid {
public static class Node {
public int value;
public Node next;
public Node(int v) {
value = v;
}
}
// (1)输入链表头结点,奇数长度返回中点,偶数长度返回上中点(中点左边的值)
public static Node midOrUpMidNode(Node head) {
if (head == null || head.next == null || head.next.next == null) {
return head;
}
// 三个或以上的单链表执行下面这个
Node slow = head.next;
Node fast = head.next.next;
while (fast.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;// 快指针一次走两步,当快指针到终点的时候,慢指针就走到上中点了
}
return slow;
}
// (2)输入链表头结点,奇数长度返回中点,偶数长度返回下中点
public static Node midOrDownMidNode(Node head) {
if (head == null || head.next == null) {// 如果头结点为空或只有一个结点,返回第一个几点就行
return head;
}
// 两个或以上的单链表执行下面这个
Node slow = head.next;
Node fast = head.next;// 只需要快指针在上一个方法里退一步就可以了
while (fast.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
// (3)输入链表头结点,奇数长度返回中点前一个,偶数长度返回中点前一个
public static Node midOrUpMidPreNode(Node head) {
if (head == null || head.next == null || head.next.next == null) {// 节点数为两个及以下的单链表返回空
return null;
}
Node slow = head;// 慢指针再慢一步就可以了
Node fast = head.next.next;
while (fast.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
public static void main(String[] args) {
Node test = null;
test = new Node(1);
test.next = new Node(2);
test.next.next = new Node(3);
test.next.next.next = new Node(4);
test.next.next.next.next = new Node(5);
test.next.next.next.next.next = new Node(6);
// test.next.next.next.next.next.next = new Node(7);
// test.next.next.next.next.next.next.next = new Node(8);
// test.next.next.next.next.next.next.next.next = new Node(9);
System.out.println(midOrUpMidNode(test).value);
System.out.println(midOrDownMidNode(test).value);
System.out.println(midOrUpMidPreNode(test).value);
}
}