题目:给定一个单链表,编写一个函数返回该链表的中间点。
题目分析:
思路一:最笨的方法,先遍历整个单链表,获得该单链表的长度length。然后第二次遍历,此次遍历的长度只需要是 length/2 即可。
思路二:利用快慢指针。快指针走两步,慢指针走一步,当快指针走到倒数第一个或者倒数第二个结点的时候结束。此时返回慢指针指向结点的数据即可。
边界条件:
1. 快指针永远比慢指针快,所以对快指针加条件即可。
(k.next!=null && k.next.next!=null) 要注意前后顺序,不然会出错。具体啥原因我还没有彻底明白。
Java代码:
/**
* 【题目】: 给定一个单链表,编写一个函数返回该链表的中间点。
* 快慢指针法
*/
public class MidValue {
// 定义内部类
class Node{
int data; // 数据域
Node next; // 指针域
// 默认构造函数,初始化不带数据的头结点。
public Node() {
}
// 构造函数,用于创建结点。
public Node(int data){
this.data = data;
}
}
// 创建单链表
public Node creat(){
Node head = new Node(); // 创建一个不带数据的头结点。
Node x = head; // 备份头结点,用于创建链表。
// 简易创建一个链表
for (int i = 1; i <= 1024; i=i*2+1) {
x.next = new Node(i);
x = x.next;
}
return head;
}
// 输出单链表,输出测试。
public void showList(Node head){
// Node x = head;
Node x = head.next;
while (x!=null){
System.out.print(x.data+" ");
x = x.next;
}
System.out.println();
}
public static int findMidValue(Node head){
if (head.next==null)
return 0;
// 因为该头结点不含数据
Node k = head.next;
Node m = head.next;
while (k.next!=null && k.next.next!=null){//这样可以确保,顺序要对
k = k.next.next;
m = m.next;
}
return m.data;
}
public static void main(String[] args) {
MidValue midValue = new MidValue();
Node list1 = midValue.creat();
System.out.println("原链表:");
midValue.showList(list1);
int result = midValue.findMidValue(list1);
System.out.printf("该链表的中间值为 %d", result);
}
}
【注】
(1):leetcode 等平台只要我们完成一个函数即可,本人初出茅庐,为了巩固基本知识,故自己补充了部分代码,用于练手。本代码也许存在漏洞,望高手赐教。感谢!