【每日一算法】重排链表
微信改版,加星标不迷路!
每日一算法-重排链表
作者:阿广
阅读目录
? 题目
? 解析
? 完整代码
1 题目
给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
给定链表 1->2->3->4
重新排列为 1->4->2->3.
示例 2:
给定链表 1->2->3->4->5
重新排列为 1->5->2->4->3.
2 解析
虽然代码比较长,但是思路很简单,听我慢慢讲来。
首先通过快慢指针确定链表的中间位置;
然后将中间位置之后的后半段链表压入栈中;
最后出栈,并按照规则插入到链表的相应位置。
2.1首先通过快慢指针确定链表的中间位置;
//快慢指针找到中点
ListNode* s = head;
ListNode* q = head;
while(q && q->next && q->next->next){
s = s->next;
q = q->next->next;
}
2.2然后将中间位置之后的后半段链表压入栈中;
//将右边部门压入栈中
ListNode* right = s->next;
s->next = NULL;
stack<ListNode*> st;
while(right){
st.push(right);
right = right->next;
}
2.3最后出栈,并按照规则插入到链表的相应位置。
//将栈中的数按照规则出栈并插入
ListNode* cur = head;
while(!st.empty()){
ListNode* p = st.top();
st.pop();
ListNode* next = cur->next;
cur->next = p;
p->next = next;
cur = next;
}
肯定有读者会提出,能不能详细介绍一下啊,这些指针指来指去的好乱啊,下面用图给你们讲解一下。
有点难看,确是本题的骨髓~
3 完整代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void reorderList(ListNode* head) {
if(!head || !head->next) return ;
//快慢指针找到中点
ListNode* s = head;
ListNode* q = head;
while(q && q->next && q->next->next){
s = s->next;
q = q->next->next;
}
//将右边压入栈中
ListNode* right = s->next;
s->next = NULL;
stack<ListNode*> st;
while(right){
st.push(right);
right = right->next;
}
//将栈中的数按照规则出栈并插入
ListNode* cur = head;
while(!st.empty()){
ListNode* p = st.top();
st.pop();
ListNode* next = cur->next;
cur->next = p;
p->next = next;
cur = next;
}
}
};
今日问题
谈一下你了解的贪心算法是什么?
打卡格式:打卡第n天,答:...
为什么打卡?戳下面你就知道了!
猛
戳
这
儿
21/天/养/一/个/好/习/惯
【每日一算法】重排链表相关推荐
- 【每日一算法】相交链表
微信改版,加星标不迷路! 每日一算法 - 相交链表 编写一个程序,找到两个单链表相交的起始节点. 如下面的两个链表: 在节点 c1 开始相交. 示例 1: 输入:intersectVal = 8, l ...
- 【每日一算法】 合并两个有序链表
微信改版,加星标不迷路! 每日一算法-合并两个有序链表 作者:阿广 阅读目录 1 题目 2 解析 1 题目 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. ...
- 【每日一算法】二叉树的层次遍历 II
每日一算法-二叉树的层次遍历 II 题目 给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如: 给定二叉树 [3,9,20,null,n ...
- 【每日一算法】两数相加
微信改版,加星标不迷路! 每日一算法-两数相加 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两 ...
- 【L2-022 重排链表】天梯赛L2系列详细解答
天梯赛L2-022 重排链表 题目详情: 输入样例: 00100 6 00000 4 99999 00100 1 12309 68237 6 -1 33218 3 00000 99999 5 6823 ...
- 【每日一算法】对称二叉树
每日一算法-对称二叉树 题目 给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 2 / \ / \ 3 4 4 3 但是 ...
- 【每日一算法】使用二分法解决x 的平方根问题
每日一算法-x 的平方根 题目 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: ...
- 【每日一算法】最大子序列和
每日一算法-最大子序列和 题目 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4] ...
- 【每日一算法】杨辉三角 II
每日一算法-杨辉三角 II 题目 给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行. 在杨辉三角中,每个数是它左上方和右上方的数的和. 示例: 输入: 3 输出: [1,3,3,1] ...
最新文章
- 日本依靠储能系统解决光伏消纳问题
- MySQL 5.1中IN查询不要用到NULL条件
- Pytorch-使用Bert预训练模型微调中文文本分类
- Java动态代理之cglib
- 【Ubuntu】Ubuntu16.04安装 搜狗输入法 史上最详细
- mysql5.5删除干净_MySql5.5 安装及卸载
- linux用户批量修改密码,Linux 命令详解 chpasswd 批量修改用户密码
- 字符设备与块设备的区别
- php检查数组下标是否,php检查数组下标是否存在
- Smart3D输出/输入空三结果
- OpenCV下载驿站(解决github下载问题,解决OpenCV官网下载较慢)
- html调用java函数_html通过JavaScript调用java代码
- Halcon练习:图片及文件夹的读取
- 把Excel转换成word文档有什么简单的方法
- 《增长黑客》学习总结
- 近岸蛋白递交注册:年营收3.4亿 朱化星控制71.24%表决权
- 《商用密码应用与安全性评估》第四章 密码应用安全性评估实施要点-小结
- DDL,DQL,DML,DCL全称
- Java多线程与并发相关 — 原理
- Web前端之网页导航----搜导航狐邮箱(float)