Reverse Nodes in k-Group,LeetCode
2016-10-09 23:46
375 查看
前面一题是只调换两个数,所以添加两个引用就可以解决了,多了一个变量K,这个方法就不再适用了,因此我另外想了一个截然不同的方法。
上代码,这题貌似是截止目前为止提交次数最多的一题,终于看到绿色的accepted之后激动地点了个夜宵,扯远了,代码中的个别细节的确值得琢磨
public ListNode reverseKGroup(ListNode head, int k) {
if(head == null) {
return null;
}
ListNode myHead = head;
ListNode temp = head;
ArrayList<ListNode> list = new ArrayList<>();
do {
list.add(temp);
temp = temp.next;
}while(temp != null);
int n = list.size();
if(n < k || n == 1 || k == 1) {
return head;
}
while(n >= k) {
if(n == list.size()) {
myHead = list.get(k - 1);
myHead.next = list.get(k - 2);
list.get(0).next = list.get(k - 1).next;
for(int i = 1;i < k - 1;i++) {
list.get(i).next = list.get(i - 1);
}
}
else {
list.get(list.size() - n - k).next = list.get(list.size() - n + k - 1);
list.get(list.size() - n).next = list.get(list.size() - n + k - 1).next;
for(int i = 1;i < k;i++) {
list.get(list.size() - n + i).next = list.get(list.size() - n + i -1);
}
}
n -= k;
}
return myHead;
}
先是一些特殊情况的处理,由于考虑不周,大部分情况都是在提交失败之后才留意到的。
然后是对“正常”情况的处理。贴一段抄来的文字,来自
ArrayList 和LinkedList 的优缺点
如果应用需要快速访问数据,很少或不插入和删除元素,就应该用数组,也就是ArrayList;
如果应用需要经常插入和删除元素你就需要用链表数据结构了,也就是LinkedList。
这题需要频繁地访问位置不确定的数据,完全不用插入和删除,为了扬长避短,先把原来的链表转换成ArrayList.
要实现翻转,只需要改变指针的指向就可以了,无需改变ArrayList中元素的位置
我实现翻转的顺序是从链表头开始,每找到K个节点,转,不足K个节点了,也就结束了
在代码实现上,没有想到什么好的方法,因此头K个节点的翻转和后面节点的翻转只能分开处理
下面记录一下花费我时间最多的点。
假设原链表是0,1,2,3,4,5,6,7,K是3
第一次循环,头节点定为2 , 2指向1 , 1指向0 , 0指向3
第二次循环,要注意是0指向5,而不是2指向5
写出来才发现是这么简单的一个细节,顿时感觉半小时之前的自己有点zz了。
上代码,这题貌似是截止目前为止提交次数最多的一题,终于看到绿色的accepted之后激动地点了个夜宵,扯远了,代码中的个别细节的确值得琢磨
public ListNode reverseKGroup(ListNode head, int k) {
if(head == null) {
return null;
}
ListNode myHead = head;
ListNode temp = head;
ArrayList<ListNode> list = new ArrayList<>();
do {
list.add(temp);
temp = temp.next;
}while(temp != null);
int n = list.size();
if(n < k || n == 1 || k == 1) {
return head;
}
while(n >= k) {
if(n == list.size()) {
myHead = list.get(k - 1);
myHead.next = list.get(k - 2);
list.get(0).next = list.get(k - 1).next;
for(int i = 1;i < k - 1;i++) {
list.get(i).next = list.get(i - 1);
}
}
else {
list.get(list.size() - n - k).next = list.get(list.size() - n + k - 1);
list.get(list.size() - n).next = list.get(list.size() - n + k - 1).next;
for(int i = 1;i < k;i++) {
list.get(list.size() - n + i).next = list.get(list.size() - n + i -1);
}
}
n -= k;
}
return myHead;
}
先是一些特殊情况的处理,由于考虑不周,大部分情况都是在提交失败之后才留意到的。
然后是对“正常”情况的处理。贴一段抄来的文字,来自
ArrayList 和LinkedList 的优缺点
如果应用需要快速访问数据,很少或不插入和删除元素,就应该用数组,也就是ArrayList;
如果应用需要经常插入和删除元素你就需要用链表数据结构了,也就是LinkedList。
这题需要频繁地访问位置不确定的数据,完全不用插入和删除,为了扬长避短,先把原来的链表转换成ArrayList.
要实现翻转,只需要改变指针的指向就可以了,无需改变ArrayList中元素的位置
我实现翻转的顺序是从链表头开始,每找到K个节点,转,不足K个节点了,也就结束了
在代码实现上,没有想到什么好的方法,因此头K个节点的翻转和后面节点的翻转只能分开处理
下面记录一下花费我时间最多的点。
假设原链表是0,1,2,3,4,5,6,7,K是3
第一次循环,头节点定为2 , 2指向1 , 1指向0 , 0指向3
第二次循环,要注意是0指向5,而不是2指向5
写出来才发现是这么简单的一个细节,顿时感觉半小时之前的自己有点zz了。
相关文章推荐
- [LeetCode]Reverse Nodes in k-Group
- LeetCode Online Judge 题目C# 练习 - Reverse Nodes in k-Group
- LeetCode_Reverse Nodes in k-Group
- [leetcode]Reverse Nodes in k-Group
- 【leetcode】Reverse Nodes in k-Group
- leetcode Reverse Nodes in k-Group
- LeetCode-Reverse Nodes in k-Group
- LeetCode - Reverse Nodes in k-Group
- leetcode 42: Reverse Nodes in k-Group
- leetcode Reverse Nodes in k-Group
- Reverse Nodes in k-Group [LeetCode]
- LeetCode : Reverse Nodes in k-Group
- LeetCode-Reverse Nodes in k-Group
- [LeetCode] Reverse Nodes in k-Group 解题报告
- LeetCode: Reverse Nodes in k-Group
- leetcode -- Reverse Nodes in k-Group
- [LeetCode] Swap Nodes in Pairs、Reverse Nodes in k-Group、Rotate List
- LeetCode | Reverse Nodes in k-Group
- LeetCode: Reverse Nodes in k-Group
- leetcode 42: Reverse Nodes in k-Group