问题描述:1->2->3->4,假设k=2进行反转,得到2->1->4->3;k=3进行反转,得到3->2->1->4

算法思想:基本操作就是链表反转,将k个元素当作滑动窗口,依次进行反转。

 public class ReverseNodesInKGroup {
public ListNode reverseKGroup(ListNode head, int k) {
if (k == 1 || head == null || head.next == null)
return head;
ListNode first = head, last = head;
ListNode preHead = new ListNode(-1);
preHead.next = head;
ListNode preGroup = preHead, nextGroup = preHead;
int count = 1;
while (last != null)
{
if (count != k)
{
last = last.next;
count++;
}
else
{
nextGroup = last.next;
reverseList(first, last);// 节点反转后,first <- ... <-clast
preGroup.next = last;// 前面转换过的组连接到新的组,pregrou记录prehead,最后返回prehead
preGroup = first;
first.next = nextGroup;
first = nextGroup;
last = nextGroup;
count = 1;
} }
return preHead.next;
}
//基本反转操作
private void reverseList(ListNode head, ListNode tail) {
ListNode pre = new ListNode(-1), node = head;
pre.next = head;
while (pre != tail) {
ListNode temp = node.next;
node.next = pre;
pre = node;
node = temp;
}
}
}

特例Swap nodes in pairs

问题描述:给一序列,交换每相邻的两个元素,并返回头结点。例如:1-2-3-4   返回序列2-1-4-3

算法思路:除了第一组元素,其他每次交换一对儿元素,要改变四个指针。所以,定义四个指针。其中只有两个指针是不想关,其他依赖这两个指针。

方法一:

 public ListNode swapPairs(ListNode head) {
if(head == null || head.next == null)
{
return head;
}
ListNode pPre = new ListNode(0);
pPre.next = head;
ListNode p1 = head;
ListNode p2 = null;
ListNode pNext = null;
ListNode temp = null;
while(p1!= null && p1.next != null)
{
p2 = p1.next;
if(p1 == head)
{
temp = p2;
}
pNext = p2.next;
p2.next = p1;
p1.next = pNext;
pPre.next = p2;
pPre = p1;
p1 = pNext;
}
return temp; }

方法二:

public static ListNode swapPairs(ListNode head) {
ListNode pPrepre = null; //节点对的前前元素
ListNode pPre = null; //节点对的前一个元素,依赖p
ListNode p = head; //要移动的节点对的第一个元素
ListNode pNext = null; //节点对的第二个元素,依赖p
while (p != null && p.next != null) {
pPre = p;
p = p.next;
pNext = p.next;
if (pPre == head) {
head = p;
}
if (pPrepre != null) {
pPrepre.next = p;
}
p.next = pPre;
pPre.next = pNext; pPrepre = pPre;//其他元素都依赖p,但pPrepre不依赖p,所以每次移动pPrepre和p
p = pNext;
}
return head;
}

Reverse Nodes In K Group,将链表每k个元素为一组进行反转---特例Swap Nodes in Pairs,成对儿反转的更多相关文章

  1. [Swift]LeetCode23. 合并K个排序链表 | Merge k Sorted Lists

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. E ...

  2. lintcode-104-合并k个排序链表

    104-合并k个排序链表 合并k个排序链表,并且返回合并后的排序链表.尝试分析和描述其复杂度. 样例 给出3个排序链表[2->4->null,null,-1->null],返回 -1 ...

  3. 代码题(14)— 合并有序链表、数组、合并K个排序链表

    1.21. 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出 ...

  4. leecode刷题(27)-- 合并k个排序链表

    leecode刷题(27)-- 合并k个排序链表 合并k个排序链表 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1-> ...

  5. 【LeetCode】23.合并K个排序链表

    题目描述 23.合并K个排序链表 合并k个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] ...

  6. Java实现 LeetCode 23 合并K个排序链表

    23. 合并K个排序链表 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输 ...

  7. [Leetcode] Reverse nodes in k group 每k个一组反转链表

    Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If ...

  8. K组翻转链表 · Reverse Nodes in k-Group

    [抄题]: 给你一个链表以及一个k,将这个链表从头指针开始每k个翻转一下.链表元素个数不是k的倍数,最后剩余的不用翻转. [思维问题]: [一句话思路]: // reverse head->n1 ...

  9. Swap Nodes & Reverse Nodes in k-Group

    Swap Nodes | Given a linked list, swap every two adjacent nodes and return its head. Example Given 1 ...

随机推荐

  1. python框架Scrapy中crawlSpider的使用

    一.创建Scrapy工程 #scrapy startproject 工程名 scrapy startproject demo3 二.进入工程目录,根据爬虫模板生成爬虫文件 #scrapy genspi ...

  2. JavaScript 学习(1)--window对象

    JavaScript 学习--Window对象 window对象方法 1.1 创建新窗体 //窗体打开 var newWindow=Window.open("default.html&quo ...

  3. Java 语言基础之运算符

    使用运算符之后,肯定有返回结果. 六种运算符: 算术运算符 赋值运算符 比较运算符 逻辑运算符 位运算符 三元运算符 1. 算术运算符 加(+), 减(-), 乘(*), 除(/), 取余(%), 自 ...

  4. Python的3个方法:静态方法(staticmethod),类方法(classmethod)和实例方法

    Python的方法主要有3个,即静态方法(staticmethod),类方法(classmethod)和实例方法,如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...

  5. ViewConfiguration 和 ViewConfigurationCompat

    Contains methods to standard constants used in the UI for timeouts, sizes, and distances. 一.几个常用的方法 ...

  6. 上手Keras

    Keras的核心数据是“模型”,模型是一种组织网络层的方式.Keras中主要的模型是Sequential模型,Sequential是一系列网络层按顺序构成的栈. Sequential模型如下: fro ...

  7. android学习五---OpenCV for android环境搭建

    学习android的目的是想在手机上实现计算机视觉的算法.一般算法的研究都是在Matlab上进行,但是手机平台没有那么多的计算资源,用matlab显然是不太现实的.而OpenCV是基于C++语言编写的 ...

  8. 用Android NDK编译FFmpeg

    附(2018-01-06):     有一个将x264及lame等库集成进去了且基于android的ffmpeg的编译方法,地址参见:       https://github.com/writing ...

  9. ZeroMQ作者于昨天下午宣布选择安乐死

    … printf("goodbye, world !");

  10. python学习之路-第三天-函数

    函数 函数的定义关键字:def 使用global语句可以清楚地表明变量是在外面的块定义的 示例:(函数运行完毕后x的值是2) #!/usr/bin/python # Filename: func_gl ...