非空的單向鏈表,返回其中間節點。若是有兩個中間結點,返回第二個。 鏈表大小控制在1~100之間。node
示例1:git
Input: [1,2,3,4,5]
Output: Node 3 from this list (Serialization: [3,4,5])
複製代碼
示例2:github
Input: [1,2,3,4,5,6]
Output: Node 4 from this list (Serialization: [4,5,6])
複製代碼
循環遍歷鏈表,統計鏈表長度,同時將每一個結點存儲數組中,最後返回數組中角標爲(鏈表長度/2)的結點便可。數組
/**
* 求單向鏈表的中間結點,使用數組實現
* @param head
* @return
*/
public SingleNode middleNodeByArrays(SingleNode head) {
SingleNode[] arrays = new SingleNode[100];
int count = 0;
while (head != null) {
arrays[count] = head;
count++;
head = head.next;
}
return arrays[count / 2];
}
複製代碼
測試代碼:bash
// 求單向鏈表的中間結點
SingleLinkedList sll1 = new SingleLinkedList();
for (int i = 1; i < 10; i++) {
SingleNode node = new SingleNode(i, null);
sll1.add(node);
}
System.out.println(sll1.toString());
SingleNode node1 = middleNodeByArrays(sll1.getFirst());
sll1.logFromHead("middleNodeByArrays1", node1);
SingleLinkedList sll2 = new SingleLinkedList();
for (int i = 1; i < 11; i++) {
SingleNode node = new SingleNode(i, null);
sll2.add(node);
}
System.out.println(sll2.toString());
SingleNode node2 = middleNodeByArrays(sll2.getFirst());
sll2.logFromHead("middleNodeByArrays2", node2);
複製代碼
輸出結果:符合預期。測試
SingleLinkedList:[1, 2, 3, 4, 5, 6, 7, 8, 9]
middleNodeByArrays1:[5, 6, 7, 8, 9]
SingleLinkedList:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
middleNodeByArrays2:[6, 7, 8, 9, 10]
複製代碼
定義兩個指針slow和fast,slow每次移動一步,fast每次移動兩步,這樣當fast尾結點的時候,slow必定位於鏈表的中間結點上。 代碼以下:ui
/**
* 求單向鏈表的中間結點,使用快慢指針實現
* @param head
* @return
*/
public SingleNode middleNodeByTwoPointers(SingleNode head) {
SingleNode slow = head;
SingleNode fast = head;
while(fast != null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
複製代碼
測試代碼以下:this
// 求單向鏈表的中間結點
SingleLinkedList sll1 = new SingleLinkedList();
for (int i = 1; i < 10; i++) {
SingleNode node = new SingleNode(i, null);
sll1.add(node);
}
System.out.println(sll1.toString());
SingleNode node1 = middleNodeByTwoPointers(sll1.getFirst());
sll1.logFromHead("middleNodeByTwoPointers1", node1);
SingleLinkedList sll2 = new SingleLinkedList();
for (int i = 1; i < 11; i++) {
SingleNode node = new SingleNode(i, null);
sll2.add(node);
}
System.out.println(sll2.toString());
SingleNode node2 = middleNodeByTwoPointers(sll2.getFirst());
sll2.logFromHead("middleNodeByTwoPointers2", node2);
複製代碼
輸出結果以下:符合預期spa
SingleLinkedList:[1, 2, 3, 4, 5, 6, 7, 8, 9]
middleNodeByTwoPointers1:[5, 6, 7, 8, 9]
SingleLinkedList:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
middleNodeByTwoPointers2:[6, 7, 8, 9, 10]
複製代碼
項目中搜索SingleLinkedList便可。.net
github傳送門 github.com/tinyvampire…
gitee傳送門 gitee.com/tinytongton…