IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 专题复习二:链表(2) -> 正文阅读

[数据结构与算法]专题复习二:链表(2)

leetcode?86. 分隔链表

首先将链表分隔为比目标值小的一段和比目标值大的一段

需要四个指针

class Solution {
public:
    ListNode* partition(ListNode* head, int x) {
        if(!head) return nullptr;
        //不能直接让smallHead 或者 bigHead直接等于head 原因是不确定head-》val与x的大小关系
        ListNode* smallHead = new ListNode(0);
        ListNode* smallTail = smallHead;
        ListNode* bigHead = new ListNode(0);
        ListNode* bigTail = bigHead;
        while(head)
        {
            if(head->val < x)
            {
                smallTail->next = head;
                smallTail = smallTail->next;
            }
            else
            {
                bigTail->next = head;
                bigTail = bigTail->next;
            }
            head = head->next;
        }
        bigTail->next = nullptr;
        smallTail->next = bigHead->next;
        return smallHead->next;

    }
};

leetcode??234. 回文链表

利用辅助栈,首先将链表节点中的元素依次压入栈中,然后在依次出栈,与链表前面比较

class Solution {
public:
    bool isPalindrome(ListNode* head) {
        if(!head) return false;
        ListNode* temp = head;
        stack<int> a;
        int len = 0;//用来记录 链表的长度
        //将节点中的值压入栈中
        while(temp)
        {
            a.push(temp->val);
            len++;
            temp = temp->next;
        }
        //因为只需要比较链表中一半即可,因此len/2
        len >> 1;//即len/2
        while(len--)
        {
            if(head->val != a.top())
            {
                return false;
            }
            a.pop();
            head = head->next;
        }
        return true;

    }
};

leetcode?两两交换链表中的节点

方法一:利用迭代的方法, 两两交换节点中的值来达到 交换节点的效果

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        if(!head) return nullptr;
        ListNode* temp = head;
        while(temp&&temp->next)
        {
            //交换相邻两个节点中的值
            int first = temp->val;
            temp->val = temp->next->val;
            temp->next->val = first;
            //往后移动两个节点
            temp = temp->next->next;
        }
        return head;
    }
};

方法二:利用递归的方法

递归的三个要素: (1)终止条件 (2)调用自身 (3)返回值

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        if(!head || !head->next) return head;//终止条件
        ListNode * third = swapPairs(head->next->next); 
        //将前面的两个节点互相调换 并指向third       
        ListNode* second = head->next;
        second->next = head;
        head->next = third;
        return second;
    }
};

leetcode141. 环形链表

方法一:利用快慢指针,slow和fast? ?fast = fast->next->next? slow = slow->next

fast的速度是slow的两倍,如果链表存在环,那么它们肯定会相遇

class Solution {
public:
    bool hasCycle(ListNode *head) {
        ListNode *slow = head;
        ListNode *fast = head;
        while(fast && fast->next) //这里只需要关注 fast即可  
        { 
            fast = fast->next->next;
            if(!fast) return false;
            slow = slow->next;
            if(slow==fast) //说明fast和slow相遇了
            {
                return true;
            }
        }
        return false;
    }
};

方法二: 利用set set的底层实现是二叉搜索树,因此,其搜索效率更高

class Solution {
public:
    bool hasCycle(ListNode *head) {
        if(!head) return false;
        set<ListNode*> a;
        while(head)
        {
            if(a.find(head)!= a.end()) //说明set中已经存在该节点,说明链表中存在环
            {
                return true;
            }
            a.insert(head);
            head = head->next;
        }
        return false;
    }
};

leetcode142. 环形链表 II

方法一:利用快慢指针

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {

        ListNode* fast = head;
        ListNode* slow = head;
        while(fast && fast->next)
        {
            fast = fast->next->next;
            if(!fast) return NULL;
            slow = slow->next;
            if(slow == fast)//首先找到fast和slow相遇的点
            {
                while(head != slow) //
                {
                    head = head->next;
                    slow = slow->next;
                }
                return slow;
            }
        }
        return NULL;
        
    }
};

上述题目同样可以利用set,但是其效率较低,不建议采用。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-22 14:26:57  更:2021-07-22 14:28:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 17:23:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码