数据结构基础之《(16)—链表题目》

一、链表问题

1、对于笔试,不用太在乎空间复杂度,一切为了时间复杂度

2、对于面试,时间复杂度依然放在第一位,但是一定要找到空间最省的方法

二、快慢指针

逻辑:

慢指针一次走1步

快指针一次走2步

当快指针走完的时候,慢指针应该来到中点的位置

1、输入链表头节点,奇数长度返回中点,偶数长度返回上中点

2、输入链表头节点,奇数长度返回中点,偶数长度返回下中点

3、输入链表头节点,奇数长度返回中点前一个,偶数长度返回上中点前一个

4、输入链表头节点,奇数长度返回中点前一个,偶数长度返回下中点前一个

java 复制代码
package class06;

import java.util.ArrayList;

/**
 * 快慢指针
 */
public class Code01_LinkedListMid {

	public static class Node {
		public int value;
		public Node next;
		
		public Node(int v) {
			value = v;
		}
	}
	
	/**
	 * 奇数情况返回中点,偶数情况返回上中点
	 * @param head:头节点
	 * @return
	 */
	public static Node midOrUpMidNode(Node head) {
		if (head == null || head.next == null || head.next.next == null) {
			return head;
		}
		// 链表有3个点或以上
		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;
	}
	
	/**
	 * 奇数情况返回中点,偶数情况返回下中点
	 * @param head:头节点
	 * @return
	 */
	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;
	}
	
	/**
	 * 奇数情况返回中点前一个,偶数情况返回上中点前一个
	 * @param head:头节点
	 * @return
	 */
	public static Node midPreOrUpMidPreNode(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;
	}
	
	/**
	 * 奇数情况返回中点前一个,偶数情况返回下中点前一个
	 * @param head:头节点
	 * @return
	 */
	public static Node midPreOrDownMidPreNode(Node head) {
		if (head == null || head.next == null) {
			return null;
		}
		if (head.next.next == null) {
			return head;
		}
		Node slow = head;
		Node fast = head.next;
		while (fast.next != null && fast.next.next != null) {
			slow = slow.next;
			fast = fast.next.next;
		}
		return slow;
	}
	
	public static Node right1(Node head) {
		if (head == null) {
			return head;
		}
		Node cur = head;
		ArrayList<Node> arr = new ArrayList<>();
		while (cur != null) {
			arr.add(cur);
			cur = cur.next;
		}
		return arr.get((arr.size() - 1) / 2);
	}
	
	public static Node right2(Node head) {
		if (head == null) {
			return null;
		}
		Node cur = head;
		ArrayList<Node> arr = new ArrayList<>();
		while (cur != null) {
			arr.add(cur);
			cur = cur.next;
		}
		return arr.get(arr.size() / 2);
	}
	
	public static Node right3(Node head) {
		if (head == null || head.next == null || head.next.next == null) {
			return null;
		}
		Node cur = head;
		ArrayList<Node> arr = new ArrayList<>();
		while (cur != null) {
			arr.add(cur);
			cur = cur.next;
		}
		return arr.get((arr.size() - 3) / 2);
	}
	
	public static Node right4(Node head) {
		if (head == null || head.next == null) {
			return null;
		}
		Node cur = head;
		ArrayList<Node> arr = new ArrayList<>();
		while (cur != null) {
			arr.add(cur);
			cur = cur.next;
		}
		return arr.get((arr.size() - 2) / 2);
	}
	
	public static void main(String[] args) {
		
		Node head = new Node(0);
		Node tail = head;
		
		for (int i = 1; i < 10; i++) {
			Node node = new Node(i);
			tail.next = node;
			tail = tail.next;
		}
		
		System.out.println(midOrUpMidNode(head).value);
		System.out.println(right1(head).value);
		
		System.out.println(midOrDownMidNode(head).value);
		System.out.println(right2(head).value);
		
		System.out.println(midPreOrUpMidPreNode(head).value);
		System.out.println(right3(head).value);
		
		System.out.println(midPreOrDownMidPreNode(head).value);
		System.out.println(right4(head).value);
	}
}
相关推荐
WBluuue14 小时前
数据结构与算法:树上倍增与LCA
数据结构·c++·算法
lkbhua莱克瓦2415 小时前
Java基础——集合进阶用到的数据结构知识点1
java·数据结构·笔记·github
杨福瑞15 小时前
数据结构:单链表(2)
c语言·开发语言·数据结构
王璐WL16 小时前
【数据结构】单链表及单链表的实现
数据结构
z1874610300317 小时前
list(带头双向循环链表)
数据结构·c++·链表
T.Ree.18 小时前
cpp_list
开发语言·数据结构·c++·list
童话ing18 小时前
【Golang】常见数据结构原理剖析
数据结构·golang
是苏浙19 小时前
零基础入门C语言之C语言实现数据结构之顺序表应用
c语言·数据结构·算法
lkbhua莱克瓦2419 小时前
Java基础——常用算法3
java·数据结构·笔记·算法·github·排序算法·学习方法
小白程序员成长日记19 小时前
2025.11.07 力扣每日一题
数据结构·算法·leetcode