数据结构与算法(JAVA版)6_1:快慢指针

面试时链表解题方法论

(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);
	}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章