问题描述: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. 【IDEA】本地新建Maven项目+配置Git和GitHub+代码上传和拉取到GitHub+其他IDEA和GitHub实战

    一.本地新建Maven项目并启动成功 1. 按照IDEA提供的模板,构建一个maven webapp的模板项目. 一路Next,到最后的finish.如下图. 2. 新建Tomcat,启动刚建立的项目 ...

  2. 【Python之路】第二十篇--MySQL(二)

    视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名], 用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. 1.创建视图 --格式:CREATE ...

  3. Centos7 下安装mysql数据库

    centos7系统,安装mysql发现已经默认的是mariadb. 只能安装mariadb,mariadb是mysql一个分支,对mysql完全支持 1 安装 yum -y install maria ...

  4. 10.php引用(&)详解及注意事项

    <?php function &test() { static $b=0;//申明一个静态变量 $b=$b+1; echo $b; return $b; } $a=test();//这条 ...

  5. Unicode 和 UTF-8 是什么关系?

    2015-10-14 10:08    评论: 9 收藏: 4 转载自: http://huoding.com/2015/10/13/472作者: 火丁笔记本文地址:https://linux.cn/ ...

  6. The Log: What every software engineer should know about real-time data's unifying abstraction

    http://engineering.linkedin.com/distributed-systems/log-what-every-software-engineer-should-know-abo ...

  7. Storm-源码分析- bolt (backtype.storm.task)

    Bolt关键的接口为execute, Tuple的真正处理逻辑, 通过OutputCollector.emit发出新的tuples, 调用ack或fail处理的tuple /** * An IBolt ...

  8. Map,Filter和Reduce

    转自:https://www.aliyun.com/jiaocheng/444967.html?spm=5176.100033.1.13.xms8KG 摘要:Map,Filter和Reduce三个函数 ...

  9. IO 流之字节流和转换流

    基本读取操作: InputStream(); OutputStream(); // 直接写入目的地中, 不需要 flush() 刷新 write(byte[] b); // 参数为 byte 数组 字 ...

  10. windows7下搭建django开发环境

    Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC)风格的 Web 应用程序框架. 使用 Django,我们在几分钟之内就可以创建高品质.易维护.数据库驱动的应用程序. ...