代码随想录day4

24.两两交换链表:注意虚拟头节点的使用

cpp 复制代码
ListNode* swapPairs(ListNode* head) {
        ListNode* dummy = new ListNode();
        dummy->next = head;
        ListNode* current = dummy;
        while(current->next != nullptr && current->next->next != nullptr){
            ListNode* tmp = current->next;
            ListNode* tmp1 = current->next->next->next;

            current->next = current->next->next;
            current->next->next = tmp;
            current->next->next->next = tmp1;
            current = current->next->next;
        }
        return dummy->next;
    }

19.删除链表中的倒数第N个结点:注意使用快慢指针,以及中间的间隔n的判断

cpp 复制代码
ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummy = new ListNode();
        dummy->next = head;
        ListNode* fast = dummy;
        ListNode* slow = dummy;
        //先移动fast指针领先slow n+1 个位置
        while(n-- && fast != nullptr){
            fast = fast->next;
        }
        fast = fast->next;
        //同时移动fast,slow到fast抵达最后
        while(fast != nullptr){
            fast = fast->next;
            slow = slow->next;
        }
        //删除第N个需要用到的是第N-1个节点
        ListNode* tmp = slow->next;
        slow->next = tmp->next;
        delete(tmp);
        return dummy->next;
        
}

面试题02.07链表相交://理解链表相交不是值相等,而是指向同一块区域

cpp 复制代码
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode* listA = headA;
        ListNode* listB = headB;
        int lenA = 0, lenB = 0;
        while(listA != nullptr){
            listA = listA->next;
            lenA++;
        }
        
        while(listB != nullptr){
            listB = listB->next;
            lenB++;
        }
        if(lenB > lenA){
            swap(headA, headB);
            swap(lenA, lenB);
        }
        int gap = lenA - lenB;
        listA = headA;
        listB = headB;
        while(gap--){
            listA = listA->next;
        }
        while(listA != nullptr && listB != nullptr){
            if(listA == listB){
                return listA;
            }else{
                listA = listA->next;
                listB = listB->next;
            }
        }
        return nullptr;
    }

142.环形链表II://需理解为甚么fast比slow快1就能在环中相遇,什么时候fast追上slow,以及追上后如何获取环的入口位置

cpp 复制代码
ListNode *detectCycle(ListNode *head) {
        ListNode* fast = head;
        ListNode* slow = head;
        while(fast != nullptr && fast->next != nullptr){
            fast = fast->next->next;
            slow = slow->next;
            //找到fast与slow在环中的相遇点
            if(fast == slow){
                ListNode* left = head;
                ListNode* right = fast;
                while(left != nullptr && right != nullptr){
                    if(left == right){
                        return left;
                    }
                    left = left->next;
                    right = right->next;

                }
                
            }
            
        }
        return nullptr;
    }
相关推荐
এ᭄画画的北北3 分钟前
力扣-287.寻找重复数
算法·leetcode
景彡先生4 小时前
C++并行计算:OpenMP与MPI全解析
开发语言·c++
归去_来兮5 小时前
深度学习模型在C++平台的部署
c++·深度学习·模型部署
pay4fun7 小时前
2048-控制台版本
c++·学习
YuTaoShao8 小时前
【LeetCode 热题 100】141. 环形链表——快慢指针
java·算法·leetcode·链表
hjjdebug8 小时前
ffplay6 播放器关键技术点分析 1/2
c++·ffmpeg·音视频
小小小新人121239 小时前
C语言 ATM (4)
c语言·开发语言·算法
Azxcc09 小时前
C++异步编程入门
开发语言·c++
吐泡泡_9 小时前
C++(STL源码刨析/vector)
c++
你的冰西瓜9 小时前
C++排序算法全解析(加强版)
c++·算法·排序算法