代码随想录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;
    }
相关推荐
Bona Sun2 分钟前
单片机手搓掌上游戏机(二十)—pico运行doom之编译环境
c语言·c++·单片机·游戏机
Albert Edison34 分钟前
【项目设计】C++ 高并发内存池
数据结构·c++·单例模式·哈希算法·高并发
我真不会起名字啊1 小时前
C、C++中的sprintf和stringstream的使用
java·c语言·c++
猿饵块1 小时前
ros2--图像/image
c++
资深web全栈开发1 小时前
LeetCode 3625. 统计梯形的数目 II
算法·leetcode·组合数学
橘颂TA1 小时前
【剑斩OFFER】算法的暴力美学——外观数列
算法·leetcode·职场和发展·结构与算法
Liangwei Lin1 小时前
洛谷 P1434 [SHOI2002] 滑雪
算法
c#上位机1 小时前
halcon图像增强之自动灰度拉伸
图像处理·算法·c#·halcon·图像增强
rit84324991 小时前
压缩感知信号恢复算法:OMP与CoSaMP对比分析
数据库·人工智能·算法
Pluchon2 小时前
硅基计划4.0 算法 FloodFill算法
java·算法·leetcode·决策树·逻辑回归·深度优先·图搜索算法