虚拟头节点
class Solution
{
public:
ListNode* swapPairs(ListNode* head)
{
auto dummy{ new ListNode(-1, head) };
for (auto prev{ dummy }, curr{ head };
curr != nullptr && curr->next != nullptr;
prev = curr, curr = curr->next)
{
prev->next = curr->next;
curr->next = curr->next->next;
prev->next->next = curr;
}
return dummy->next;
}
};
快慢指针
class Solution
{
public:
ListNode* removeNthFromEnd(ListNode* head, int n)
{
auto dummy{ new ListNode(-1, head) };
auto fast{ dummy }, slow{ dummy };
for (int i = n; i > 0; i--)
{
fast = fast->next;
}
while (fast != nullptr && fast->next != nullptr)
{
fast = fast->next;
slow = slow->next;
}
auto prev{ slow }, curr{ slow->next };
prev->next = curr->next;
delete curr;
return dummy->next;
}
};
双指针
class Solution
{
public:
ListNode* getIntersectionNode(ListNode* headA, ListNode* headB)
{
auto pA{ headA }, pB{ headB };
if (pA == nullptr || pB == nullptr)
{
return nullptr;
}
while (pA != pB)
{
pA = (pA != nullptr) ? pA->next : headB;
pB = (pB != nullptr) ? pB->next : headA;
}
return pA;
}
};
快慢指针
class Solution
{
public:
ListNode* detectCycle(ListNode* head)
{
auto fast{ head }, slow{ head };
if (head == nullptr || head->next == nullptr)
{
return nullptr;
}
while (fast != nullptr && fast->next != nullptr)
{
fast = fast->next->next;
slow = slow->next;
if (fast == slow)
{
auto ptr{ head };
while (ptr != slow)
{
ptr = ptr->next;
slow = slow->next;
}
return ptr;
}
}
return nullptr;
}
};