题目描述:
给定一个带有头结点 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
示例1:
示例2:
提示:
- 给定链表的结点数介于1和100之间
思路:
- (解法1)我们可以先求出长度,然后循环遍历将值存到list种,然后长度/2则是中间结点。
- (解法2)快慢指针法。慢指针一次走一步,快指针一次走两步,快指针走到末端,慢指针正好指向中间结点。如果快指针为空,慢指针正好指向中间结点,链表结点数为偶数。如果快指针为空,慢指针正好指向第二个中间结点,链表结点数为奇数。
代码
解法一
class Solution {
public ListNode middleNode(ListNode head) {
if(head == null){
return head;
}
List<ListNode> list = new ArrayList<ListNode>(); //创建一个list用于存储
while(head != null){ //只要头指针不是null,则一直循环
list.add(head); //将当前头指针的内容添加到list
head = head.next; //然后将头指针往后移
}
return list.get(list.size() / 2); //最后输出中间结点,不论奇偶都符合题目条件
}
}
解法二(快慢指针法)
public ListNode middleNode(ListNode head) {
ListNode slow = head; //定义一个慢指针
ListNode fast = head; //定义一个快指针
while (true){
if(fast==null || fast.next ==null){
return slow;
}
slow = slow.next; //慢指针向后走一步
fast = fast.next.next; //快指针向后走两步
}
}