【题目】
给定一个单链表的头节点head,实现一个调整单链表的函数,使得每K个节点之间逆序,如果最后不够K个节点一组,则不调整最后几个节点。
例如:
链表:1->2->3->4->5->6->7->8->null,K = 3。
调整后为:3->2->1->6->5->4->7->8->null。其中7、8不调整,因为不够一组。
【解题思路】
方法一:
使用栈,每K个节点依次入栈,并依次删除
然后栈弹出尾插法插入节点
方法二:
直接在链表中使用头插法,进行反转

 #include <iostream>
#include <stack>
using namespace std; struct Node
{
int val;
Node* next;
Node(int a = ) :val(a), next(nullptr) {}
};
void printList(Node* head)
{
Node *p = head->next;
while (p)
{
cout << p->val << "->";
p = p->next;
}
cout << endl;
} void byStack(Node* head, int k)
{
Node* p = head->next, *pre = head;
stack<Node*>s;//保留节点地址,就不用删除和新建节点步骤
while (p)
{
s.push(p);
p = p->next;
if (s.size() == k)
{
pre->next = p;
while (!s.empty())
{
s.top()->next = pre->next;//断开循环
pre->next = s.top();
pre = pre->next;
s.pop();
}
}
}
printList(head);
} void notStack(Node* head, int k)
{
Node* p = head->next, *pre = head, *q, *tmp = nullptr;
int s = ;
while (p)
{
if (s == )
{
tmp = pre->next;//每次循环更新的头结点
pre->next = nullptr;//断开循环
}
q = p->next;
p->next = pre->next;
pre->next = p;
p = q;
s++;
if (s == k)
{
s = ;
pre = tmp;
pre->next = p;
}
}
tmp->next = nullptr;
p = pre->next;
pre->next = nullptr;//断开循环
while (p)//将后面不足k个节点还原
{
q = p->next;
p->next = pre->next;
pre->next = p;
p = q;
}
printList(head);
} int main()
{
Node *head = new Node(-);
Node* p = head;
for (int i = ; i <= ; ++i)
{
Node*q = new Node(i);
p->next = q;
p = q;
}
printList(head);
//byStack(head, 3);
notStack(head, );
return ;
}

左神算法书籍《程序员代码面试指南》——2_11将单链表的每K个节点之间逆序的更多相关文章

  1. [程序员代码面试指南]链表问题-将单链表的每k个节点之间逆序

    题目描述 给定一个单链表的表头节点head,实现一个调整单链表的函数,是的每k个节点之间逆序,如果最后不够k个节点一组,则不调整最后几个节点. 题解 内部函数reverse实现链表beg到end的翻转 ...

  2. 《程序员代码面试指南》第二章 链表问题 将单链表每K个节点之间逆序

    样例 链表1-2-3-4-5-6-7-8-9-10 K=3 ,结果 3-2-1-6-5-4-9-8-7-10 java代码 /** * @Description:将单链表每K个节点之间逆序 * @Au ...

  3. 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点

    题目 在单链表和双链表中删除倒数第K个节点 java代码 /** * @Description:在单链表和双链表中删除倒数第K个节点 * @Author: lizhouwei * @CreateDat ...

  4. 左神算法书籍《程序员代码面试指南》——2_03删除链表的中间节点和a/b处的节点

    [题目]给定链表的头节点head,实现删除链表的中间节点的函数.例如:不删除任何节点:1->2,删除节点1:1->2->3,删除节点2:1->2->3->4,删除节 ...

  5. 《程序员代码面试指南》第二章 链表问题 删除中间节点和a/b处节点

    题目 例如 1-2-3-4 删除2,1-2-3-4-5 删除3 例如 a=1,b =2 java代码 /** * @Description:删除中间节点和a/b处节点 * @Author: lizho ...

  6. [程序员代码面试指南]二叉树问题-在二叉树中找到两个节点的最近公共祖先、[LeetCode]235. 二叉搜索树的最近公共祖先(BST)(非递归)

    题目 题解 法一: 按照递归的思维去想: 递归终止条件 递归 返回值 1 如果p.q都不在root为根节点的子树中,返回null 2 如果p.q其中之一在root为根节点的子树中,返回该节点 3 如果 ...

  7. 程序员代码面试指南:IT名企算法与数据结构题目最优解

      第1章栈和队列 1设计一个有getMin功能的栈(士★☆☆☆) 1由两个栈组成的队列(尉★★☆☆) 5如何仅用递归函数和栈操作逆序一个栈(尉★★☆☆) 8猫狗队列(士★☆☆☆)10用一个栈实现另一 ...

  8. 程序员代码面试指南 IT名企算法与数据结构题目最优解

    原文链接 这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现.针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮 ...

  9. 左神算法书籍《程序员代码面试指南》——3_05Morris遍历二叉树的神级方法【★★★★★】

    [问题]介绍一种时间复杂度O(N),额外空间复杂度O(1)的二叉树的遍历方式,N为二叉树的节点个数无论是递归还是非递归,避免不了额外空间为O(h),h 为二叉树的高度使用morris遍历,即利用空节点 ...

随机推荐

  1. 海量数据解决思路之Hash算法

    海量数据解决思路之Hash算法   一.概述 本文将粗略讲述一下Hash算法的概念特性,里边会结合 分布式系统负载均衡 实例对Hash的一致性做深入探讨.另外,探讨一下Hash算法在海量数据处理方案中 ...

  2. 2day:Python基础

    基础知识: 1.python文件的后缀名:.py 2 .Windows Python的执行方式:Python 解释器路径  py文件路径 例:C:\python3\python.exe d:\1.py ...

  3. 1.2_springboot2.x中redis缓存&原理介绍

    1.整合redis作为缓存 说明这里springboot版本2.19 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构 ...

  4. <Python基础>python是如何进行内存管理的

    .Python 是如何进行内存管理的?答:从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制⒈对象的引用计数机制Python 内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用 ...

  5. linux常用软连接使用ln -s

    [软连接]另外一种连接称之为符号连接(Symbolic Link),也叫软连接.软链接文件有类似于Windows的快捷方式.它实际上是一个特殊的文件.在符号连接中,文件实际上是一个文本文件,其中包含的 ...

  6. 7款外观迷人的HTML5/CSS3 3D特效按钮特效

    下面我整理了7款外观都十分迷人的HTML5/CSS3 3D按钮特效,有几个还挺实用的,分享给大家. 1.CSS3超酷3D弹性按钮 按钮实现非常简单 之前我们分享过几款不错的CSS3 3D立体按钮,比如 ...

  7. 【数位DP】[LOJ10168] 恨7不成妻

    还是数位DP... 状态:$f[x][val][sum]$表示当前第x位,当前数字为val,当前各位数字和为sum 观察到$val$,$sum$过大,很套路地模7即可... 每个状态存储三个要用到的值 ...

  8. 继承Activity和View

    1,当你自定一个继承自view的视图A之后, 如果你在一个继承自Activity的组件B中需要使用A里面的一些方法,如果在B中需要使用A中的一些方法好像不可以直接使用. 需要在B中使用setConte ...

  9. 深入理解Java虚拟机(程序编译与代码优化)

    文章首发于微信公众号:BaronTalk,欢迎关注! 对于性能和效率的追求一直是程序开发中永恒不变的宗旨,除了我们自己在编码过程中要充分考虑代码的性能和效率,虚拟机在编译阶段也会对代码进行优化.本文就 ...

  10. Python面向对象学习

    以下面例子作为面向对象基础介绍,类比java里的面向对象既可以,大同小异 class Employee(): raiseAmount=1.04 employeeNum= def __init__(se ...