C++ 将单链表的每K个结点逆序
来源:互联网 发布:朱少民 软件测试 视频 编辑:程序博客网 时间:2024/06/09 14:47
#include <iostream>
#include <stack>
struct Node {
int value;
Node *next;
Node(int data) : value(data), next(nullptr) {};
};
Node * reverseKNodes(Node * head, int k);
Node * reConnected(std::stack<Node *> &stack, Node * left, Node * right);
void print(const Node * head);
int main()
{
Node n1(1);
Node n2(2);
Node n3(3);
Node n4(4);
Node n5(5);
Node n6(6);
Node n7(7);
Node n8(8);
n1.next = &n2;
n2.next = &n3;
n3.next = &n4;
n4.next = &n5;
n5.next = &n6;
n6.next = &n7;
n7.next = &n8;
print(reverseKNodes(&n1, 3));
system("pause");
return 0;
}
void print(const Node * head)
{
while (head != nullptr) {
std::cout << head->value << std::endl;
head = head->next;
}
}
Node * reverseKNodes(Node * head, int k)
{
if (head == nullptr || k < 2) {
return head;
}
Node *left = nullptr;
Node *right = nullptr;
Node *cur = head;
Node *newHead = head;
std::stack<Node *> stk;
while (cur != nullptr)
{
stk.push(cur);
right = cur->next;
if (stk.size() == k) {
left = reConnected(stk, left, right);
newHead = newHead == head ? cur : newHead;//保存新的头
}
cur = right;
}
return newHead;
}
Node * reConnected(std::stack<Node *> &stack, Node * left, Node * right)
{
Node *cur = stack.top();
stack.pop();
if (left != nullptr) {//如果是传入的第一组 则不需要连接左边结点
left->next = cur;
}
while (!stack.empty()) {//栈不空,依次连接栈中的结点
cur->next = stack.top();
cur = stack.top();
stack.pop();
}
cur->next = right;//栈中元素连接完成后,将栈中最后一个结点与原链表的下一个结点连接
return cur;
}
#include <stack>
struct Node {
int value;
Node *next;
Node(int data) : value(data), next(nullptr) {};
};
Node * reverseKNodes(Node * head, int k);
Node * reConnected(std::stack<Node *> &stack, Node * left, Node * right);
void print(const Node * head);
int main()
{
Node n1(1);
Node n2(2);
Node n3(3);
Node n4(4);
Node n5(5);
Node n6(6);
Node n7(7);
Node n8(8);
n1.next = &n2;
n2.next = &n3;
n3.next = &n4;
n4.next = &n5;
n5.next = &n6;
n6.next = &n7;
n7.next = &n8;
print(reverseKNodes(&n1, 3));
system("pause");
return 0;
}
void print(const Node * head)
{
while (head != nullptr) {
std::cout << head->value << std::endl;
head = head->next;
}
}
Node * reverseKNodes(Node * head, int k)
{
if (head == nullptr || k < 2) {
return head;
}
Node *left = nullptr;
Node *right = nullptr;
Node *cur = head;
Node *newHead = head;
std::stack<Node *> stk;
while (cur != nullptr)
{
stk.push(cur);
right = cur->next;
if (stk.size() == k) {
left = reConnected(stk, left, right);
newHead = newHead == head ? cur : newHead;//保存新的头
}
cur = right;
}
return newHead;
}
Node * reConnected(std::stack<Node *> &stack, Node * left, Node * right)
{
Node *cur = stack.top();
stack.pop();
if (left != nullptr) {//如果是传入的第一组 则不需要连接左边结点
left->next = cur;
}
while (!stack.empty()) {//栈不空,依次连接栈中的结点
cur->next = stack.top();
cur = stack.top();
stack.pop();
}
cur->next = right;//栈中元素连接完成后,将栈中最后一个结点与原链表的下一个结点连接
return cur;
}
阅读全文
0 0
- C++ 将单链表的每K个结点逆序
- C++将单链表的每K个结点之间逆序改进版空间复杂度O(1)
- 将单链表的每k个节点之间逆序
- 将单链表的每k个节点之间逆序
- 链表问题---将单链表的每K个节点之间逆序
- 数据结构与算法分析笔记与总结(java实现)--链表13:每k个结点逆序问题
- 每天一道LeetCode-----将链表每k个节点逆序一次
- 【C++】返回单链表的第k个结点
- day11之求二叉树的高度+销毁一颗二叉树+链表每K个节点之间逆序
- 查找单链表的第k个结点
- 求链表的倒数第K个结点
- 二叉排序树的第k个结点
- 无头单链表第k个结点的删除
- 反转单链表的前k个结点
- 链表翻转(每K个结点进行一次逆置)
- 剑指offer(C++)——二叉搜索树的第k个结点
- [C练习]输出链表中倒数第K个结点
- 带头结点的单链表上将后k个结点变换为前k个结点的操作
- Statement 和 PreparedStatement 有什么区别?
- laytpl模板引擎使用实例1
- unity开发-Interface Not Found (105)
- 使用启动kafka中producer出现UnrecognizedOptionException错误
- NOIP2016普及组复赛第1题:买铅笔
- C++ 将单链表的每K个结点逆序
- 删除链表中等于给定值Val的所有节点
- 约束布局
- Spring MVC annotation
- Python基本文件操作
- C++的一些基本用法
- [计算机组成原理]--关于磁盘平均存取时间
- JUnit单元测试--IntelliJ IDEA
- 转载:使用 GDB 恢复堆栈信息