题目来源
题目描述
题目解析
快慢指针
不推荐,推荐看最下面的四个扩展总结
一般情况下,链表问题中设计到了位置都应该考虑通过构造双指针的移动规则来解决,因为链表无法知晓长度也无法随机访问。
class Solution {
public:
ListNode* middleNode(ListNode* head) {
ListNode *slow = head, *fast = head;
while (fast != NULL && fast->next != NULL){
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
};
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode middleNode(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while(fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
}
扩展题目
1)输入链表头节点,奇数长度返回中点,偶数长度返回上中点
2)输入链表头节点,奇数长度返回中点,偶数长度返回下中点
3)输入链表头节点,奇数长度返回中点前一个,偶数长度返回上中点前一个
4)输入链表头节点,奇数长度返回中点前一个,偶数长度返回下中点前一个
输入链表头节点,奇数长度返回中点,偶数长度返回上中点
class Solution {
public:
bool midOrUpMidPreNode(ListNode *head) {
if(head == nullptr || head->next == nullptr || head->next->next){
return head;
}
// 链表有3个点或以上
ListNode * slow = head->next;
ListNode * fast = head->next->next;
while (fast->next != nullptr && fast->next->next != nullptr){
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
};
输入链表头节点,奇数长度返回中点,偶数长度返回下中点
class Solution {
public:
bool midOrUpMidPreNode(ListNode *head) {
if(head == nullptr || head->next == nullptr){
return head;
}
ListNode * slow = head->next;
ListNode * fast = head->next;
while (fast->next != nullptr && fast->next->next != nullptr){
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
};
输入链表头节点,奇数长度返回中点前一个,偶数长度返回上中点前一个
class Solution {
public:
bool midOrUpMidPreNode(ListNode *head) {
if(head == nullptr || head->next == nullptr || head->next->next == nullptr){
return nullptr;
}
ListNode * slow = head;
ListNode * fast = head->next->next;
while (fast->next != nullptr && fast->next->next != nullptr){
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
};
输入链表头节点,奇数长度返回中点前一个,偶数长度返回下中点前一个
class Solution {
public:
bool midOrDownMidPreNode(ListNode *head) {
if(head == nullptr || head->next == nullptr){
return nullptr;
}
if(head->next->next == nullptr){
return head;
}
ListNode * slow = head;
ListNode * fast = head->next;
while (fast->next != nullptr && fast->next->next != nullptr){
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
};