问题:
方法1
最开始想到的,就是先遍历一遍,然后记录总数,然后再次遍历,找到中间的节点
代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode middleNode(ListNode head) {
ListNode index = head;
index = head.next;
int n = 1;
while(index !=null){
n++;
index = index.next;
}
System.out.println(n);
index = head;
for(int i = 1;i<=n/2;i++){
head = head.next;
}
return head;
}
}
效果:
方法2
看了答案的快慢指针法,感觉很神奇,决定尝试一下
1 | 2 | 3 | 4 | 5 | 6 | 7 | null | |
1,2 | ||||||||
1 | 2 | |||||||
1 | 2 | |||||||
1 | 2 | |||||||
1 | 2 | |||||||
1 | 2 | 3 | 4 | 5 | 6 | null | |
1,2 | |||||||
1 | 2 | ||||||
1 | 2 | ||||||
1 | 2 | ||||||
1 | |||||||
代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode middleNode(ListNode head) {
ListNode left = head;
ListNode right = head.next;
while(right != null){
left = left.next;
if(right.next!=null){
right = right.next.next;
}else{
return left;
}
}
return left;
}
}
效果: