给定一个头结点为 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点
代码一:
自己想的一个方法
class Solution {public ListNode middleNode(ListNode head) {ListNode p1 = head;ListNode p2 = head;//i,j作为判断标志int i = 1;int j = 1;//int res = 0;while(p1.next!=null){p1 = p1.next;i++;if(j<=(i>>1)){等价于j<=i/2j++;p2 = p2.next;}}return p2;}
}
代码二:
定义一个链表数组,存储所有节点,然后返回中间节点。不得不说,是自己格局小了,不会也不敢定义一个链表数组
class Solution {public ListNode middleNode(ListNode head) {ListNode[] temp= new ListNode[100];ListNode p = head;int x = 0;while(p!=null){temp[x++] = p;p = p.next;}return temp[x/2];}
}
代码三:
遍历两遍链表,第一遍用一个指针记录链表个数,第二遍遍历到1/2即返回结点
class Solution {public ListNode middleNode(ListNode head) {int i = 0;ListNode p = head;while(p!=null){i++;p = p.next;}ListNode q = head;for(int j= 0;j<i/2;j++){q = q.next;}return q;}
}
代码四:
双指针,快指针一次走两步,慢指针一次走一步。不得不说,官方果然还是官方
class Solution {public ListNode middleNode(ListNode head) {ListNode fast = head;ListNode slow = head;while(fast!=null&&fast.next!=null){slow = slow.next;fast = fast.next.next;}return slow;}
}