将单链表的每K个节点之间逆序
【说明】:
本文是左程云老师所著的《程序员面试代码指南》第二章中“将单链表的每K个节点之间逆序”这一题目的C++复现。
本文只包含问题描述、C++代码的实现以及简单的思路,不包含解析说明,具体的问题解析请参考原书。
感谢左程云老师的支持。
【题目】:
给定一个单链表的头节点 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个清空栈来进行逆序。
解法二:需要保存即将逆序的K个节点的前一个节点pre和后一个节点next
【编译环境】:
CentOS6.7(x86_64)
gcc 4.4.7
【实现】:
实现及测试代码:
/*
*文件名:list_reverse.cpp
*作者:
*摘要:将单链表的每K个节点之间逆序
*/ #include <iostream>
#include <stack> using namespace std; class Node
{
public:
Node(int data)
{
value = data;
next = NULL;
}
public:
int value;
Node *next;
}; Node* resign1(stack<Node*> &s,Node *left,Node *right)
{
Node *cur = s.top();
s.pop();
if(NULL != left)
left->next = cur;
Node *next = NULL;
while(!s.empty())
{
next = s.top();
s.pop();
cur->next = next; //反转
cur = next;
}
cur->next = right;
return cur;
} Node* reverseKNodes1(Node *head,int K)
{
if(K < )
return head;
stack<Node*> s;
Node *newHead(head),*cur(head),*pre(NULL),*next(NULL);
while(NULL != cur)
{
next = cur->next;
s.push(cur);
if(s.size() == K)
{
pre = resign1(s,pre,next);
newHead = newHead == head ? cur : newHead;
}
cur = next;
}
return newHead;
} void resign2(Node *left,Node *start,Node *end,Node* right)
{
Node *pre = start;
Node *cur = start->next;
Node *next = NULL;
while(cur != right)
{
next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
if(NULL != left)
left->next = end;
start->next = right;
} Node* reverseKNodes2(Node *head,int K)
{
if( > K)
return head;
Node *cur(head),*start(NULL),*pre(NULL),*next(NULL);
int count = ;
while(NULL != cur)
{
next = cur->next;
if(count == K)
{
start = pre == NULL ? head : pre->next;
head = pre == NULL ? cur : head; //第一次发生变化的时候确定head
resign2(pre,start,cur,next);
pre = start;
count = ;
}
count++;
cur = next;
}
return head;
} void printList(Node *head)
{
while(NULL != head)
{
cout << head->value << " ";
head = head->next;
}
cout << endl;
} int main()
{
Node *head = NULL;
Node *ptr = NULL; for(int i =;i<;i++)//构造链表
{
if(NULL == head)
{
head = new Node(i);
ptr = head;
continue;
}
ptr->next = new Node(i);
ptr = ptr->next;
}
cout << "Before reverse:" << endl;
printList(head);
cout << "First reverse:" << endl;
head = reverseKNodes1(head,);
printList(head);
cout << "Second reverse:" << endl;
head = reverseKNodes2(head,);
printList(head);
return ;
}
注:
转载请注明出处;
转载请注明源思路来自于左程云老师的《程序员代码面试指南》。
将单链表的每K个节点之间逆序的更多相关文章
- 【链表问题】打卡9:将单链表的每K个节点之间逆序
前言 以专题的形式更新刷题贴,欢迎跟我一起学习刷题,相信我,你的坚持,绝对会有意想不到的收获.每道题会提供简单的解答,如果你有更优雅的做法,欢迎提供指点,谢谢. 注:如果代码排版出现了问题麻烦通知我下 ...
- 栈和队列----将单链表的每K个节点之间逆序
将单链表的每K个节点之间逆序 给定一个单链表的头节点head,实现一个调整链表的函数,使得每K 个节点之间逆序,如果最后剩下不够K 个节点,则不调整最后几个. 例如: 链表:1—>2—>3 ...
- [算法] 将单链表的每K个节点之间逆序
题目 给定一个单链表的头结点,实现一个调整单链表的函数,使得每K个节点之间逆序,如果最后不够K个节点一组,则不调整最后几个节点. 解答 使用栈结构 import java.util.Stack; pu ...
- 算法总结之 将单链表的每K个节点之间逆序
给定一个单链表的表头节点head,实现一个调整单链表的函数,是的每k个节点之间逆序,如果最后不够k个节点一组,则不调整最后几个节点 思路: 如果k的值小于2,不调整.k<1 没有意义,k==1代 ...
- 左神算法书籍《程序员代码面试指南》——2_11将单链表的每K个节点之间逆序
[题目]给定一个单链表的头节点head,实现一个调整单链表的函数,使得每K个节点之间逆序,如果最后不够K个节点一组,则不调整最后几个节点.例如:链表:1->2->3->4->5 ...
- [程序员代码面试指南]链表问题-将单链表的每k个节点之间逆序
题目描述 给定一个单链表的表头节点head,实现一个调整单链表的函数,是的每k个节点之间逆序,如果最后不够k个节点一组,则不调整最后几个节点. 题解 内部函数reverse实现链表beg到end的翻转 ...
- 《程序员代码面试指南》第二章 链表问题 将单链表每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 ...
- [剑指offer] 14. 链表中倒数第K个节点+翻转+逆序打印+合并两个排序链表 + 链表相交(第一个公共节点) (链表)
题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路: 两个指针,起始位置都是从链表头开始,第一个比第二个先走K个节点,当第一个走到链表尾时,第二个指针的位置就是倒数第k个节点.(两指针始终相 ...
- 【链表问题】打卡2:删除单链表的第 K个节点
前言 以专题的形式更新刷题贴,欢迎跟我一起学习刷题.每道题会提供简单的解答. 题目描述 在单链表中删除倒数第 K 个节点 要求 如果链表的长度为 N, 时间复杂度达到 O(N), 额外空间复杂度达到 ...
随机推荐
- ChartControl第一课简短的控件初步设计
WinForms Controls >Controls > Chart Control > Getting Started This document gives you a qui ...
- How to Send an Email Using UTL_SMTP with Authenticated Mail Server. (文档 ID 885522.1)
APPLIES TO: PL/SQL - Version 9.2.0.1 to 12.1.0.1 [Release 9.2 to 12.1]Information in this document a ...
- oracle form 触发器执行顺序及键定义[Z]
1当打开FORM时: (1)PRE-FORM (2)PRE-BLOCK(BLOCK级) (3)WHEN-NEW-FORM-INSTANCE (4)WHEN-NEW-BLOCK-INSTANCE (5) ...
- Oracle 性能优化 — 统计数据收集[Z]
ORACLE优化器的优化方式有两大类,即基于规则的优化方式(Rule-Based Optimization,简称为RBO)和基于代价的优化方式(Cost-Based Optimization,简称为C ...
- static和extern关键字 对函数的作用
本文目录 • 一.extern与函数 • 二.static与函数 • 三.static.extern与函数的总结说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能 ...
- c++标准库函数equal_range()
首先容器(vector)的中的元素是有序的.这里就不讲容器元素类型为内置的类型的用法,因为比较容易. 重点讲一下容器元素类型为自定义类型时的用法.当我们把自定义类型的数据成员的类型的值传给equal_ ...
- 通过OCI 处理 Oracle 10g 中处理Clob大字段写入
Oracle数据库中, 通过存储过程写入Clob字段 , 当数据大于4k时, 报错 ORA-01460: 转换请求无法实施或不合理 经过排查, 数据Bind方式不对, 不能采用字符串的Bind方式 原 ...
- JQuery easyui (3) Resizable(调整大小)组件
Resizable 动态调整元素大小 不依赖其他组件 Resizable的加载方法 <div class="easyui-resizable"></div&g ...
- Android存储小结
转自:http://www.liaohuqiu.net/cn/posts/storage-in-android/ android系统自身自带有存储,另外也可以通过sd卡来扩充存储空间.前者好比pc中的 ...
- Thinkphp的页面判断
目前在做的系统中,涉及到了前端页面的判断,比如性别在数据库中存储为0或1,而页面显示应该为“男”或“女”,这里就需要用到页面判断. 比如, <volist name="st" ...