寻找中间节点
题目:寻找链表的中间节点,如果链表个数为奇数 则中间结点就是最中间的结点,如果为偶数,中间节点是中间两个节点后面的那个结点;
方法一:
遍历列表计算链表长度
找到链表的中间位置索引
遍历到链表,至到中间位置,返回中间位置
public ListNode middleNode(ListNode head) {
//1.寻找中间结点
int size=0;
for(ListNode temp=head;temp!=null;temp=temp.next){
size++;
}
size=size/2+1;
//2.取出:
ListNode temp=head;
for(int i=0;i<size-1;i++){
temp=temp.next;
}
return temp;
}
方法二:
(快慢指针)两个节点,第一个节点一次走一步,第二个节点,一次走两步,(快的走到了终点,慢的走到中间节点):
快慢指针
public ListNode middleNode(ListNode head) {
if(head==null){
return null;
}
ListNode dummyHead=new ListNode(-1);
dummyHead.next=head;
ListNode fast=head;//
ListNode slow=head;
while (fast.next!= null) {
if (fast.next.next != null) {
fast = fast.next.next;
slow=slow.next;
} else {
fast=first.next;
slow=slow.next;
}
}
return slow;
}
分析
while (fast.next!= null)
这个循环条件是因为,fast一次要向后走两步,不判断的话有可能产生 NullPointerException异常
if (fast.next.next != null) {
fast = fast.next.next;
slow=slow.next;
}
先判断fast移动两步后是否为空,如果为不为空,Fast向后走两步,slow向后走一步(如果是奇数,最后一步一定进入的是这个分支)
else{
fast=first.next;
slow=slow.next;
}
如果是偶数,一定是进入的是这个分支