就像寻找倒数第K个元素一样,使用快慢指针就可以实现一次遍历,倒数第K个是:慢指针直到快指针走了K步之后再走,直到快指针走到链表的末尾,慢指针也就走到了倒数第K个。
这个也是一样,相当于折半,那么满指针就一个一个走,快指针就两步两步走,知道快指针正好走到链表末尾或者走到链表的末尾的下一个指针null,这个终止条件很重要。
比较普通的想法是自己想的创建一个list容器,直接依次加入最后返回list大小的一半即可。
public ListNode middleNode(ListNode head) {
if (head == null){
return null;
}
int count = 0;
ArrayList<ListNode> list = new ArrayList<>();
while (head != null){
list.add(head);
head = head.next;
count++;
}
//int index = count % 2 == 0 ? count / 2 + 1 : count / 2;
return list.get(count / 2);
}
public ListNode middleNode1(ListNode head) {
if (head == null){
return null;
}
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
public void print(ListNode head){
while (head != null){
System.out.print(head.val + " ");
head = head.next;
}
}