給定一個頭結點為 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;}
}