数据结构基础之《(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);
	}
}
相关推荐
雾里看山2 小时前
顺序表VS单链表VS带头双向循环链表
数据结构·链表
好好研究5 小时前
学习栈和队列的插入和删除操作
数据结构·学习
挺菜的8 小时前
【算法刷题记录(简单题)003】统计大写字母个数(java代码实现)
java·数据结构·算法
2401_858286118 小时前
125.【C语言】数据结构之归并排序递归解法
c语言·开发语言·数据结构·算法·排序算法·归并排序
双叶8369 小时前
(C++)学生管理系统(正式版)(map数组的应用)(string应用)(引用)(文件储存的应用)(C++教学)(C++项目)
c语言·开发语言·数据结构·c++
学不动CV了12 小时前
数据结构---链表结构体、指针深入理解(三)
c语言·arm开发·数据结构·stm32·单片机·链表
算法_小学生14 小时前
LeetCode 287. 寻找重复数(不修改数组 + O(1) 空间)
数据结构·算法·leetcode
Wo3Shi4七17 小时前
哈希冲突
数据结构·算法·go
V我五十买鸡腿18 小时前
顺序栈和链式栈
c语言·数据结构·笔记·算法
七灵微19 小时前
数据结构实验习题
数据结构