您的位置:首页 > Web前端 > Node.js

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了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息