求链表的中间节点

来源:互联网 发布:青少年编程培训班 编辑:程序博客网 时间:2024/05/01 11:36

解题思路:

1.常规思路:先从头到尾遍历一次链表,求出链表长度N,随后在遍历链表一次,找出链表中的中间结点。需要遍历链表2次。

2.令面试官满意的解法:只需遍历链表一次,即设置两个指针p1和p2,开始两个指针都指向链表的头部,同时移动两个指针,一个每次移动一步,一个每次移动两步,循环的结束条件将链表个数是奇数还是偶数都包含进来,详细见代码。

public class Solution {class ListNode {int val;ListNode next = null;public ListNode(int val) { this.val = val;}}/**求链表的中间节点,也可以用双指针来实现 *  * @param head * @return */public ListNode findMidInLinkdedList(ListNode head) {if(head == null) {return null;}//p1一次只走1步,p2一次走两步ListNode p1 = head;ListNode p2 = head;//首先得把p2定位到链表的最后while (p2 != null) {if (p2.next != null) {p2 = p2.next.next ;} else {break;}p1 = p1.next ;}return p1;}}


原创粉丝点击