先随机生成一个长度20以内的链表(头插法),
然后打印该链表(遍历)。
取中值:快慢指针法。
定义两个链表节点,让其从链表头部以不同速度向后滑动,快指针是慢指针的两倍速度。
当快指针到达链表尾部时,慢指针刚好指向中间位置。
package com.yc.myHibernate;
import java.util.Random;
/**
* 快慢指针取出链表中间的值
* @author yc
*
*/
public class Solution {
public static void main(String[] args) {
ListNode head = creatListNode();
printListNode(head);
getMidList(head);
}
/**
* 生成一个随机长度的链表
* @return
*/
private static ListNode creatListNode() {
//生成随机长度
Random random = new Random();
ListNode head = new ListNode();
for (int i = 0; i < random.nextInt(20) + 1; i++) {
ListNode node = new ListNode();
node.value = i;
node.next = head.next;
head.next = node;
}
//去掉头节点,返回第一个有效节点
return head.next;
}
/**
* 打印链表
* @param head
*/
private static void printListNode(ListNode head) {
while (head != null) {
System.out.print(head.value);
head = head.next;
}
System.out.println();
}
/**
* 快慢指针取链表中值,时间复杂度O(1/2)
* @param head
*/
public static void getMidList(ListNode head) {
ListNode fastList = head;
while (fastList.next != null) {
if (fastList.next.next != null) {
head = head.next;
fastList = fastList.next.next;
} else {
//若链表长度为偶数,则输出最中间两个值。
fastList = fastList.next;
System.out.println("中值 : " + head.next.value);
}
}
System.out.println("中值: " + head.value);
}
}
class ListNode{
int value;
ListNode next;
public ListNode() {
}
}