解题思路:
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;
}
}