一道面试题,第一次碰到这道题的时候 要求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. linux 各命令字 练习

    ===============================================================                                     ...

  2. nyoj_60_谁获得了最高奖学金_201311281117

    谁获得了最高奖学金 时间限制:1000 ms  |           内存限制:65535 KB 难度:2   描述     某校的惯例是在每学期的期末考试之后发放奖学金.发放的奖学金共有五种,获取 ...

  3. C++ primer chapter 13

    拷贝 赋值 销毁 拷贝构造函数 如果一个构造函数第一个参数是自身的引用,而且任何额外参数都有默认值,则此构造函数是拷贝构造函数拷贝构造函数的第一个类型必须是引用:如果参数不是引用类型,那么调用不会成功 ...

  4. Java分代垃圾回收机制:年轻代/年老代/持久代(转)

    虚拟机中的共划分为三个代:年轻代(Young Generation).年老点(Old Generation)和持久代(Permanent Generation).其中持久代主要存放的是Java类的类信 ...

  5. 美团网 KVM虚拟化公开课学习笔记

    KVM优化技术,美团开放平台--邱剑 基于KVM现有选项做一些优化.视频地址:http://www.osforce.cn/course/77/learn#lesson/80 CPU调优: 1.Cont ...

  6. 王立平--java se的简单项目创建以及具体解释

    创建项目的简单步骤: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzQyNTUyNw==/font/5a6L5L2T/fontsize/400/ ...

  7. 123D

    后缀数组+单调栈 看了好长时间,最后看了张神的程序才搞懂 意思就是求所有子串*n*(n+1)/2 n是子串出现次数 事实上,lcp可以看成宽度为1,高度为lcp值的长方形,所有lcp放在一起就是一堆长 ...

  8. linux下安装rabbitmq以及在spring中进行集成

    ### 一.安装erlang 1. yum install ncurses-devel 2. ./configure --prefix=/usr/local/erlang20 --without-ja ...

  9. 工具分享2:Python 3.6.4、文本编辑器EditPlus、文本编辑器Geany

    工具官网下载地址: https://www.python.org/downloads/ python 3.6.0下载链接: 链接:https://pan.baidu.com/s/1snuSxsx 密码 ...

  10. html body中的标签2

    一.列表标签 列表标签分为三种. 1.无序列表<ul>,无序列表中的每一项是<li> 英文单词解释如下: ul:unordered list,“无序列表”的意思. li:lis ...