单链表每k个节点为一组进行反转(最后不满k个时不反转)
public class LinkReverse2 {
public static Node mhead=null;
public static Node mtail=null;
public static Node newLink(int n){
Node head = new Node();
head.setData(1);
head.setNext(null);
Node tmp = head;
for(int i=2;i<=n;i++){
Node newNode = new Node();
newNode.setData(i);
newNode.setNext(null);
tmp.setNext(newNode);
tmp = newNode;
}
return head;
}
public static void main(String[] args) {
Node node = newLink(10);
pritNode(node);
// Node node1 = reverseKLink(node,3);
// Node node1 = reverse(node,2);
Node node1 = reverseLink3(node,4);
pritNode(node1);
}
public static void pritNode(Node head){
Node temp = head;
while(temp !=null){
System.out.print(temp.getData()+"->");
temp = temp.getNext();
}
System.out.println();
}
/*public static Node reverseLink(Node head){
Node pre=null,cur=head,next=null;
while(cur!=null){
next=cur.getNext();
cur.setNext(pre);
pre=cur;
cur=next;
}
return pre;
}*/
/*public static Node reverseKLink(Node head,int k){
Node pre=null,cur=head,next=null;
Node pnext=null,global_head=null;
int i=0;
Node tmp=null;
while(cur!=null){
next = cur.getNext();
if(tmp==null) tmp=cur; //tmp记录当前组反转完最后一个节点
if(pnext!=null) pnext.setNext(cur); //pnext是上一组反转完最后一个节点
cur.setNext(pre);
pre=cur;
cur = next;
i++;
if(i>=k){ //当前组反转完成的时候
if(global_head==null){
global_head=pre;
}
if(pnext!=null){ //将上一组反转完的最后一个节点指向 当前组反转完后的第一个节点
pnext.setNext(pre);
}
pnext=tmp; //迭代
i=0; //新的一组反转时 关键数据初始化
tmp=null;
pre=null;
}
}
return global_head;
}*/
//反转每组
public static void inreverse(Node left,Node right){
Node pre=null,cur=left,next=null;
while(pre!=right){
next = cur.getNext();
cur.setNext(pre);
pre=cur;
cur=next;
}
if(mtail!=null) mtail.setNext(right);
mhead=right;
mtail=left;
}
//每k个节点为一组反转
public static Node reverseLink3(Node head,int k){
Node cur=head,global_head=head;
int i=1;
Node left=null,right=null;
while(cur!=null){
if(i%k==1)
left=cur;
right=cur;
cur=cur.getNext();
if(i%k==0){
inreverse(left,right);
if(mtail!=null){
mtail.setNext(cur);
}
if(global_head==head){
global_head = mhead;
}
}
i++;
}
return global_head;
}
}
单链表每k个节点为一组进行反转(最后不满k个时不反转)的更多相关文章
- LeetCode Reverse Nodes in k-Group 每k个节点为一组,反置链表
题意:给一个单链表,每k个节点就将这k个节点反置,若节点数不是k的倍数,则后面不够k个的这一小段链表不必反置. 思路:递归法.每次递归就将k个节点反置,将k个之后的链表头递归下去解决.利用原来的函数接 ...
- 用O(1)的时间复杂度删除单链表中的某个节点
给定链表的头指针和一个结点指针,在O(1)时间删除该结点.链表结点的定义如下: struct ListNode { int m_nKey; ListNode* m_pNext; }; 函数的声明如下: ...
- 【剑指offer】单链表尾部插入一个节点
#include <iostream> using namespace std; //链表结构体 struct ListNode { int m_Value; ListNode *next ...
- 含头结点的单链表C++实现(包含创建,查找,插入,追加,删除,反转,排序,合并,打印,清空,销毁等基本操作)
温馨提示:下面代码默认链表数据为字符型,本代码仅供参考,希望能对找到本随笔的人有所帮助! #include<iostream> using namespace std; typedef s ...
- [LintCode] Delete Node in the Middle of Singly Linked List 在单链表的中间删除节点
Implement an algorithm to delete a node in the middle of a singly linked list, given only access to ...
- 【链表问题】打卡9:将单链表的每K个节点之间逆序
前言 以专题的形式更新刷题贴,欢迎跟我一起学习刷题,相信我,你的坚持,绝对会有意想不到的收获.每道题会提供简单的解答,如果你有更优雅的做法,欢迎提供指点,谢谢. 注:如果代码排版出现了问题麻烦通知我下 ...
- 【链表问题】打卡2:删除单链表的第 K个节点
前言 以专题的形式更新刷题贴,欢迎跟我一起学习刷题.每道题会提供简单的解答. 题目描述 在单链表中删除倒数第 K 个节点 要求 如果链表的长度为 N, 时间复杂度达到 O(N), 额外空间复杂度达到 ...
- Java带头节点单链表的增删合并以及是否有环
带头节点单链表 1.优势: 1)当链表为空时,指针指向头结点,不会发生null指针异常 2)方便特殊操作(删除第一个有效节点或者插入一个节点在表头) 3)单链表加上头结点之后,无论单链表是否为空,头指 ...
- C语言实现单链表(不带头结点)节点的插入
对单链表进行增删改查是最主要的操作.我在上一篇博客<C语言实现链表节点的删除>实现了删除单链表中的某个节点. 这里我们要来实如今某个位置插入节点.演示样例代码上传至https://gith ...
随机推荐
- BZOJ1191 超级英雄Hero (匈牙利算法)
直接跑匈牙利,注意到“只有当选手正确回答一道题后,才能进入下一题,否则就被淘汰”,一旦无法满足就直接退出. #include <cstdio> #include <algorithm ...
- Lifting the Stone 计算几何 多边形求重心
Problem Description There are many secret openings in the floor which are covered by a big heavy sto ...
- HDU 4543
这道题感觉很坑..不过,注意一些小问题. 参考http://www.cnblogs.com/Lattexiaoyu/archive/2013/03/31/2992553.html改进了原来自己的复杂度 ...
- HDU 4540
简单得不能再简单的DP了. #include<iostream> const int inf=1<<30; using namespace std; int map[22][2 ...
- T470 Win10下触摸板手势
T470 Win10下触摸板手势 学习了:https://forum.51nb.com/thread-1742490-1-1.html 三指横向竟然是alt+tab 学习了:http://www.xi ...
- VMware Workstation 集群仲裁磁盘和数据共享磁盘的创建
近期项目须要对SQL Server建立集群服务,多个SQL Server数据库建立集群服务,对外提供唯一的URL訪问地址.当主节点断电.断网后,通过心跳线将消息传递到备用节点.备用节点在3秒内接管数据 ...
- NS3网络仿真(2):first.py
1 安装基本模块 11 安装Python 12 安装PTVS 13 加入对python-279的支持 2 在vs2013下编译NS3 3 编译NetAnim 4 在vs2 ...
- OC基础回想(十一)类别
在编写面向对象的程序时,常常要为现有的类加入一些新的行为,通常採用创建子类的方法. 只是有时候子类不方便.比方,想为NSString类加入一个新的行为,可是NSString实际上仅仅是一个类 ...
- Codeforces Round #332 (Div. 2)D. Spongebob and Squares 数学
D. Spongebob and Squares Spongebob is already tired trying to reason his weird actions and calcula ...
- u-boot的内存分布和全局数据结构
U-boot,除非在RAM中调试,一般情况下都是从flash中执行一段代码,然后将flash中储存的代码和数据搬移到ram中,然后跳转到ram中执行.当然这应该也是一般的bootloader的执行方式 ...