面试被问到:
请说一下单向链表如何快速找到中间的那个元素?
解答的不是很好,准备尝试写有关算法的知识点,但愿秋天能有所收获,就这样!
/**
* 单向链表`在这里插入代码片`
*/
public class MyListNode {
// 定义一个变量
int val;
MyListNode next;
MyListNode(int x) {
this.val = x;
}
public static void outPutLinkedList(MyListNode head) {
MyListNode tmp = head;
while(null != tmp) {
System.out.println(tmp.val);
// 每次取值将下一个赋值给当前对象
tmp = tmp.next;
if(null != tmp) {
System.out.println(" -> ");
}
}
}
public static MyListNode middleNode(MyListNode head) {
MyListNode slowNode = head;
MyListNode fastNode = head;
while(fastNode != null && fastNode.next !=null) {
// 慢指针每次移一个位置
slowNode = slowNode.next;
// 快指针每次移两个位置,直到快指针的next.next 为空才结束,其中 next 当前节点
fastNode = fastNode.next.next;
}
return slowNode;
}
public static void main(String[] args) {
MyListNode h1 = new MyListNode(1);
MyListNode l1 = new MyListNode(2);
MyListNode l2 = new MyListNode(8);
MyListNode l3 = new MyListNode(3);
MyListNode l4 = new MyListNode(9);
MyListNode l5 = new MyListNode(11);
MyListNode l6 = new MyListNode(21);
h1.next = l1; l1.next = l2; l2.next = l3; l3.next = l4; l4.next = l5; l5.next = l6;
outPutLinkedList(h1);
System.out.println();
MyListNode middleNode = middleNode(h1);
System.out.println(middleNode.val);
}
}