24. Swap Nodes in Pairs + 25. Reverse Nodes in k-Group
▶ 问题:单链表中的元素进行交换或轮换。
▶ 24. 每两个元素进行翻转。如 [1 → 2 → 3 → 4 → 5] 变换为 [2 → 1 → 4 → 3 → 5]
● 初版代码,4 ms
class Solution
{
public:
ListNode* swapPairs(ListNode* head)
{
int length;
ListNode newHead(-), *x, *y;
newHead.next = head; // 添加头结点,方便操作原链表的首元
for (x = head, length = ; x != nullptr; x = x->next, length++);// 计算链表元素个数
if (length <= ) // 无需交换的情形
return head;
for (x = &newHead, y = x->next; y != nullptr && y->next != nullptr; x = x->next->next, y = y->next)
{ // y 指向需要交换的两个节点的靠前一个,x 指向 y 的再前一个节点
x->next = x->next->next;
y->next = x->next->next;
x->next->next = y;
}
return newHead.next;
}
};
● 改良版代码,3 ms 。减少了结点计数,改变了操作顺序,后面 k 元轮换的算法与此类似。
class Solution
{
public:
ListNode* swapPairs(ListNode* head)
{
if (head == nullptr || head->next == nullptr)// 0 或 1 个元素
return head;
ListNode newHead(-);
newHead.next = head;
for (ListNode *x = &newHead, *y = x->next->next;;)// y指向需要交换的两个元素的后者
{
x->next->next = x->next->next->next;
y->next = x->next;
x->next = y;
x = y->next; // 一定存在,不用检查 nullptr
if (x->next == nullptr || (y = x->next->next) == nullptr)
break;
}
return newHead.next;
}
};
▶ 25. 每 k 个元素进行翻转。如 k = 4 时,[1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 → 9] 变换为 [4 → 3 → 2 → 1 → 8→ 7 → 6 → 5 → 9]
● 自己的代码,26 ms
class Solution
{
public:
ListNode* reverseKGroup(ListNode* head, int k)
{
int length, front;
ListNode newHead(-), *x, *y, *z, *w;
for (x = head, length = ; x != nullptr; x = x->next, length++);// 求链表长,是否还剩 k 元可以进行轮换由 length 决定
if (length < || k < || length < k) // 不需要调整的情形
return head;
for (front = , newHead.next = head, x = &newHead; (length - front) / k;)// front 代表当前处理的元素的最大序号(w 指向的元素的编号)
{
y = x, z = y->next, w = z->next;
for (front++; front % k; front++)// 每次循环先跳转 y、z、w 建立一个链接
{
y = z, z = w, w = w->next;
z->next = y;
}
x->next->next = w; // 之后建立与 x 有关的链接
y = x->next;
x->next = z;
x = y;
}
return newHead.next;
}
};
● 大佬的代码,25 ms
class Solution
{
public:
ListNode* reverseKGroup(ListNode* head, int k)
{
ListNode *node = head, *rev;
for (int i = ; i < k; node = node->next, i++)
{
if (node == NULL)
return head;
}
rev = reverse(head, node);
head->next = reverseKGroup(node, k);
return rev;
}
ListNode * reverse(ListNode *start, ListNode *end)
{
ListNode *prev = end, *next;
while (start != end)
{
next = start->next;
start->next = prev;
prev = start;
start = next;
}
return prev;
}
};
24. Swap Nodes in Pairs + 25. Reverse Nodes in k-Group的更多相关文章
- 24. Swap Nodes in Pairs(M);25. Reverse Nodes in k-Group(H)
24. Swap Nodes in Pairs Given a linked list, swap every two adjacent nodes and return its head. For ...
- [Leetcode][Python]25: Reverse Nodes in k-Group
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 25: Reverse Nodes in k-Grouphttps://oj. ...
- Leetcode 25. Reverse Nodes in k-Group 以每组k个结点进行链表反转(链表)
Leetcode 25. Reverse Nodes in k-Group 以每组k个结点进行链表反转(链表) 题目描述 已知一个链表,每次对k个节点进行反转,最后返回反转后的链表 测试样例 Inpu ...
- [LeetCode] 25. 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. k ...
- 蜗牛慢慢爬 LeetCode 25. Reverse Nodes in k-Group [Difficulty: Hard]
题目 Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. ...
- 【LeetCode】25. Reverse Nodes in k-Group (2 solutions)
Reverse Nodes in k-Group Given a linked list, reverse the nodes of a linked list k at a time and ret ...
- 25.Reverse Nodes in k-Group (List)
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If ...
- 25. Reverse Nodes in k-Group (JAVA)
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. k ...
- LeetCode 25 Reverse Nodes in k-Group Add to List (划分list为k组)
题目链接: https://leetcode.com/problems/reverse-nodes-in-k-group/?tab=Description Problem :将一个有序list划分 ...
随机推荐
- (转) C++中成员初始化列表的使用
C++在类的构造函数中,可以两种方式初始化成员数据(data member). 1,在构造函数的实现中,初始类的成员数据.诸如: class point{private: int x,y;public ...
- 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(二)-- Web Api Demo
在上一篇里,我已经建立了一个简单的Web-Demo应用程序.这一篇将记录将此Demo程序改造成一个Web Api应用程序. 一.添加ASP.NET Core MVC包 1. 在project.json ...
- Dataframe 中的 and vs &
refer to: http://dougaoyang.github.io/2017/09/22/pandas-bool-compare.html df[(df['pop']>3) and (d ...
- string str将str转字符数组以及字符数组初始化
c和指针(<pointers on c>) 8.1.11 一个字符串,如"hello",一般为字符串常量,可以用它对字符指针赋值,或初始化,相当于把这个字符串常量的首地 ...
- DMABUFF
1.DMABUF框架提供了在多设备间共享缓存的通用方法,支持DMABUF的设备驱动可以将一个DMA缓存以文件句柄的方式输出到用户空间(输出者规则),以文件句柄的方式从用户空间获取一个DMA缓存,这个文 ...
- JUC线程池之 Callable和Future
Callable 和 Future 简介 Callable 和 Future 是比较有趣的一对组合.当我们需要获取线程的执行结果时,就需要用到它们.Callable用于产生结果,Future用于获取结 ...
- RK3288 wifi模块打开或关闭5G信号
CPU:RK3288 系统:Android 5.1 如果硬件使用的wifi模块支持5G,则系统设置中打开wifi,除了会搜索到普通的2.4G信号,还会搜索到xxx_5G信号. 如果路由器开了5G信号, ...
- opencv中的更通用的形态学
为了处理更为复杂的情况,opencv中还支持更多的形态学变换. 形态学名称 操作过程 操作名称 是否需要temp参数 开操作 open open(src)=先腐蚀,后膨胀 CV_MOP_OPEN 否 ...
- 【appium】keyevent的keycode
方法1 AppiumDriver实现了在上述功能,代码如下(java版本) driver.sendKeyEvent(66); 方法2 HashMap<String, Integer> ke ...
- WPF Demo3
<Window x:Class="Demo3.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/ ...