24. 两两交换链表中的节点
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* DummyHead = new ListNode(0);
DummyHead -> next = head;
ListNode* cur = DummyHead;
while (cur->next!=nullptr && cur->next->next!=nullptr)//还要判断cur->next!=null;
{
ListNode* tmp = cur ->next;
cur->next = tmp ->next;
tmp->next = cur->next->next;
cur->next->next = tmp;
cur = tmp;
}
ListNode* result = DummyHead->next;
delete DummyHead;
DummyHead = nullptr;
return result;
}
};
19.删除链表的倒数第N个节点
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode* slow = dummyHead;
ListNode* fast = dummyHead;
while(n-- && fast != NULL) {
fast = fast->next;
}
fast = fast->next; // fast再提前走一步,因为需要让slow指向删除节点的上一个节点
while (fast != NULL) {
fast = fast->next;
slow = slow->next;
}
slow->next = slow->next->next;
// ListNode *tmp = slow->next; C++释放内存的逻辑
// slow->next = tmp->next;
// delete tmp;也需要删除虚拟头节点;
return dummyHead->next;
}
};
面试题 02.07. 链表相交
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(!headA||!headB) return nullptr;
ListNode *PA=headA,*PB=headB;
while(true){
if(PA==PB)return PA;
PA=PA!=nullptr?PA->next:headB;
PB=PB!=nullptr?PB->next:headA;
}
}
};
142.环形链表II
三点注意:
要先判断链表是否为空,否则赋值操作会报错
循环时要判断fast 指针是否为nullptr,否则报错
是否相等用==;
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
if(head == nullptr||head->next == nullptr) return NULL;//考虑链表为空,判断是否相等用==
ListNode *slow = head, *fast = head;
slow = slow->next;
fast = fast->next->next;
while (slow!=fast)
{
if(fast == nullptr||fast->next==nullptr) return NULL;
slow = slow->next;
fast = fast->next->next;
}
ListNode *pos = head;
while (pos!=slow )
{
slow = slow->next;
pos = pos->next;
}
return pos;
}
};