一道面试题,第一次碰到这道题的时候 要求10分钟之内手写代码实现,当时没写出来,后来花点时间把过程梳理一遍,也挺简单的.......

思路就是在原来单链表反转的基础上,加几个控制参数,记录几个关键节点。

每k个为一组。

先自定义一个Node类:

public class Node {
private int data;
private Node next; public Node(int data, Node next) {
this.data = data;
this.next = next;
} public Node() {
} @Override
public String toString() {
return "Node{" +
"data=" + data +
", next=" + next +
'}';
} public int getData() {
return data;
} public void setData(int data) {
this.data = data;
} public Node getNext() {
return next;
} public void setNext(Node next) {
this.next = next;
}
}

实现代码:

public class LinkReverse2 {

    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);
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;
}
}

思路图:

单链表每k个节点一组进行反转(最后不足k个也反转)的更多相关文章

  1. 用O(1)的时间复杂度删除单链表中的某个节点

    给定链表的头指针和一个结点指针,在O(1)时间删除该结点.链表结点的定义如下: struct ListNode { int m_nKey; ListNode* m_pNext; }; 函数的声明如下: ...

  2. 【剑指offer】单链表尾部插入一个节点

    #include <iostream> using namespace std; //链表结构体 struct ListNode { int m_Value; ListNode *next ...

  3. [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 ...

  4. 以K个为一组反转单链表,最后不足K个节点的部分也反转

    package StackMin.ReverseList_offer16; public class ReverseKgroup_extend_offer16 { /** * 分组反转单链表,最后不足 ...

  5. 将单链表的每K个节点之间逆序

    [说明]: 本文是左程云老师所著的<程序员面试代码指南>第二章中“将单链表的每K个节点之间逆序”这一题目的C++复现. 本文只包含问题描述.C++代码的实现以及简单的思路,不包含解析说明, ...

  6. 【链表问题】打卡9:将单链表的每K个节点之间逆序

    前言 以专题的形式更新刷题贴,欢迎跟我一起学习刷题,相信我,你的坚持,绝对会有意想不到的收获.每道题会提供简单的解答,如果你有更优雅的做法,欢迎提供指点,谢谢. 注:如果代码排版出现了问题麻烦通知我下 ...

  7. [算法] 将单链表的每K个节点之间逆序

    题目 给定一个单链表的头结点,实现一个调整单链表的函数,使得每K个节点之间逆序,如果最后不够K个节点一组,则不调整最后几个节点. 解答 使用栈结构 import java.util.Stack; pu ...

  8. 算法总结之 将单链表的每K个节点之间逆序

    给定一个单链表的表头节点head,实现一个调整单链表的函数,是的每k个节点之间逆序,如果最后不够k个节点一组,则不调整最后几个节点 思路: 如果k的值小于2,不调整.k<1 没有意义,k==1代 ...

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

    [题目]给定一个单链表的头节点head,实现一个调整单链表的函数,使得每K个节点之间逆序,如果最后不够K个节点一组,则不调整最后几个节点.例如:链表:1->2->3->4->5 ...

随机推荐

  1. 大逃亡(escape.*)

    给出数字N(1<=N<=10000),X(1<=x<=1000),Y(1<=Y<=1000),代表有N个敌人分布一个X行Y列的矩阵上,矩形的行号从0到X-1,列号从 ...

  2. Void 参数

    在C程序中如果在声明函数的时候如果没有任何参数那么需要将参数定义为void以此来限定此函数不可传递任何参数,如果不进行限定让参数表默认为空其意义是可以传递任何参数,这个问题的由来实际上是由于要兼容早期 ...

  3. Spring MVC-集成(Integration)-集成LOG4J示例(转载实践)

    以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_log4j.htm 说明:示例基于Spring MVC 4.1.6. 以下示例说明 ...

  4. mybatis原理流程

    无论是用过的hibernate,mybatis,你都可以法相他们有一个共同点: 从配置文件(通常是XML配置文件中)得到 sessionfactory. 由sessionfactory  产生 ses ...

  5. [PWA] Optimize Assets Delivery using preload and prefetch

    By default, browsers load the assets in a render-blocking way. Modern browsers introduced prefetch a ...

  6. SDUT OJ -2892 A

    A nid=24#time" title="C.C++.go.haskell.lua.pascal Time Limit60ms Memory Limit 65536K java. ...

  7. Java 设计模式—装饰者模式

    在Java编程语言中,嵌套了非常多设计模式的思想,比如IO流中的缓冲流就使用到以下要介绍的装饰者设计模式. 演示样例代码: * 抽象构件角色:定义一个抽象接口,来规范准备附加功能的类 * @autho ...

  8. HTML_项目符号使用图片

    本文出自:http://blog.csdn.net/svitter 创建一个HTML页面. 其内容为一个无序列表. 列表中至少包括了5本畅销书,每本书之前的项目符号必须採用概述封面的缩略图. 这些信息 ...

  9. Android HAL模块实现

    1. HAL介绍 Android的HAL(Hardware Abstract Layer硬件抽象层)是为了保护一些硬件提供商的知识产权而提出的.是为了避开linux的GPL束缚. 思路是把控制硬件的动 ...

  10. 浅析 Linux 中的时间编程和实现原理一—— Linux 应用层的时间编程【转】

    本文转载自:http://www.cnblogs.com/qingchen1984/p/7007631.html 本篇文章主要介绍了"浅析 Linux 中的时间编程和实现原理一—— Linu ...