25. Reverse Nodes in k-Group 怎样不使用额外空间翻转一个单向链表?
2017-01-05 12:20
225 查看
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.
If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.
You may not alter the values in the nodes, only nodes itself may be changed.
Only constant memory is allowed.
For example,
Given this linked list:
For k = 2, you should return:
For k = 3, you should return:
设置一个prehead ,cur = head,循环让cur的next 插入到 prehead 的next:
发现一个规律:!
A->next = B->next 并且 A在B前面的话 结果会使 B 脱离链表
If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.
You may not alter the values in the nodes, only nodes itself may be changed.
Only constant memory is allowed.
For example,
Given this linked list:
1->2->3->4->5
For k = 2, you should return:
2->1->4->3->5
For k = 3, you should return:
3->2->1->4->5
设置一个prehead ,cur = head,循环让cur的next 插入到 prehead 的next:
发现一个规律:!
A->next = B->next 并且 A在B前面的话 结果会使 B 脱离链表
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public 9ddf : ListNode* reverseKGroup(ListNode* head, int k) { if(k == 1 || head == NULL) return head; ListNode dummy(-1); ListNode *prehead = &dummy, *pre = prehead, *cur = prehead, *nex; prehead->next = head; int n = 0; while(cur = cur->next) n++;//注意 cur的初始化 while(n >= k){ cur = pre->next;//注意 pre的初始化 nex = cur->next; //注意cur只能向后移动k - 1次 for(int i = 0; i < k - 1; i++){//有人说这里使用多余的空间 int i,而不是要求的常量空间,但是每次循环的上次循环已经释放了 cur->next = nex->next; nex->next = pre->next; pre->next = nex; nex = cur->next; } pre = cur;//cur的val没变 但是位置已经向后移动过k - 1次,到达k个的最后一个 n -= k; } return prehead->next; } };
相关文章推荐
- 给定一个单链表,从链表返回一个随机节点的值。 每个节点必须具有相同的选择概率。 跟进: 如果这个链表非常大,而且它的长度不为人知呢? 你能解决这个问题,而不使用额外的空间?
- 请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量)。 给定一个string iniString,请返回一个string,为翻转后的字符串。保证字符串的
- 原串翻转 请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量)。 给定一个string iniString,请返回一个string,为翻转后的字符串
- 请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量)
- 不使用额外空间,将 A,B两链表的元素交叉归并
- 设计算法并写出代码移除字符串中重复的字符,不能使用额外的缓存空间。注意: 可以使用额外的一个或两个变量,但不允许额外再开一个数组拷贝。
- 写程序。设ha和hb分别是两个带头结点的非递减有序单链表的头指针,试设计算法,将这两个有序链表合并成一个非递增有序的单链表。要求使用原链表空间,
- 对一个数组按给定的下标排序,仅使用两两交换的方式,要求不能对数组进行扩容尽可能使用额外少的空间。原数组为:A,B,C,D,E, 现给定新的位置为3, 0, 1, 4, 2那么排序为D,A,B,E,C
- 使用一个额外变量解决”请用最少的额外空间将一个M*N的矩阵旋转90度“
- 有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度。
- 【数据结构】对一个数组按给定的下标排序,仅使用两两交换的方式,要求不能对数组进行扩容尽可能使用额外少的空间
- 不使用额外空间,将 A,B两链表的元素交叉归并
- 面试题9 不使用额外的 buffer 删除单向链表中的重复项
- 取值为[1,n-1]含n个元素的整数数组,至少存在一个重复数,即可能存在多个重复数,O(n)时间内找出其中任意一个重复数,不使用额外存储空间。
- 实现对一个含n个元素的单链表的逆转.要去除存储链表本身所需的空间外,该过程只能使用固定大小的存储空间.
- 有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度。 给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转
- 不使用额外空间,将 A,B两链表的元素交叉归并
- 【算法之链表(四)】在不使用额外节点存储空间的情况下,实现单链表逆序
- 给定一个单向链表(长度未知),请设计一个既节省时间又节省空间的算法来找出该链表中的倒数第m个元素。实现这个算法,并为可能出现的特例情况安排好处理措施。“倒数第m个元素”是这样规定的:当m=0时,链表的
- 单向链表的逆序,不使用额外节点存储实现