Reverse Nodes In K Group,将链表每k个元素为一组进行反转---特例Swap Nodes in Pairs,成对儿反转
问题描述: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,成对儿反转的更多相关文章
- [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 ...
- lintcode-104-合并k个排序链表
104-合并k个排序链表 合并k个排序链表,并且返回合并后的排序链表.尝试分析和描述其复杂度. 样例 给出3个排序链表[2->4->null,null,-1->null],返回 -1 ...
- 代码题(14)— 合并有序链表、数组、合并K个排序链表
1.21. 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出 ...
- leecode刷题(27)-- 合并k个排序链表
leecode刷题(27)-- 合并k个排序链表 合并k个排序链表 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1-> ...
- 【LeetCode】23.合并K个排序链表
题目描述 23.合并K个排序链表 合并k个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] ...
- Java实现 LeetCode 23 合并K个排序链表
23. 合并K个排序链表 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输 ...
- [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 ...
- K组翻转链表 · Reverse Nodes in k-Group
[抄题]: 给你一个链表以及一个k,将这个链表从头指针开始每k个翻转一下.链表元素个数不是k的倍数,最后剩余的不用翻转. [思维问题]: [一句话思路]: // reverse head->n1 ...
- 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 ...
随机推荐
- SetForegroundWindow以及 如何将一个某个窗口提到最顶层(转)
http://hi.baidu.com/gookings/item/2b7912ca8d5b3625a0b50aa2 SetForegroundWindow 函数功能:该函数将创建指定窗口的线程设置到 ...
- 创建TPL自定义模板
文件布局 <!--1d7c7a527b6335cc7a623305ca940e1findex.tpl.html--> <!DOCTYPE html PUBLIC "-//W ...
- CStdioFile.WriteString无法向文件写入中文
CStdioFile.WriteString向文件中写入字符串,但字符串中带有中文的,无法写入. 解决方案: 将带有中文的字符串进行转换后再写入文件. char* pBuffer = NULL; lo ...
- php 正则表达式二.基本语法
官方手册正则语法:http://php.net/manual/zh/reference.pcre.pattern.syntax.php 正则表达式在线测试工具:regexpal 正则表达式的匹配先后顺 ...
- JS去遍历Table的所有单元格中的内容
用JS去遍历Table的所有单元格中的内容,可以用如下JS代码实现 function GetInfoFromTable(tableid) { var tableInfo = ""; ...
- Byzantine failures
https://baike.baidu.com/item/拜占庭将军问题/265656?fr=aladdin 拜占庭将军问题(Byzantine failures),是由莱斯利·兰伯特提出的点对点通信 ...
- 如何在 window 上面输入特殊字符?
打开 字符映射表 程序 选中任意一个字符,它会在下方显示该字符的 16进制 转换16进制至10进制,并在输入法打开的状态下,按住 Alt 键输入 10 进制数值即可.
- 0504-Hystrix保护应用-Hystrix Dashboard的使用与常见问题总结
一.概述 Hystrix的主要优势之一是它收集的每个HystrixCommand的度量集合. Hystrix仪表板以高效的方式显示每个断路器的运行状况. 以前查看通过http://localhost: ...
- Convolutional Neural Networks for Visual Recognition
http://cs231n.github.io/ 里面有很多相当好的文章 http://cs231n.github.io/convolutional-networks/ Table of Cont ...
- django Form表单的使用
Form django表单系统中,所有的表单类都作为django.forms.Form的子类创建,包括ModelForm 关于django的表单系统,主要分两种 基于django.forms.Form ...