Reverse Nodes in k-Group,LeetCode

来源:互联网 发布:python 键盘控制程序 编辑:程序博客网 时间:2024/06/05 04:21

前面一题是只调换两个数,所以添加两个引用就可以解决了,多了一个变量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了。







0 0
原创粉丝点击