赞
踩
k
,k小于链表长度,要求对链表中每k
个节点进行一次翻转,如示例所示k
的子链(简称k
链)进行一个翻转,将前一个k
链的末尾节点连接上下一个k
链的开头节点。k
链,方法有不少,但是最实用的方法就是设置头指针和尾指针,尾指针指向第k
个节点即可。k
链之后,就是进行翻转操作,这里使用头插法,链表翻转就不多介绍了。k
链和下一个k
链的问题了。主要有两个方面。
k
链翻转之后,会丢失指向下一个k
链头节点的next
指针,因此我们需要使用nxt
通过顺序遍历k+1
次预先记录这一个节点。k
链来说,这两个必须是已经翻转过的k
链,比如1->2->3->4->5
,k=2
,要连接前两个k链的时候,必须是2->1
,4->3
,也就是连接1->4
形成2->1->4->3
,否则如果先连接,再翻转,就是现有2->1->3->4
然后再翻转之后就成了2->1->3<-4
,此时4
节点就丢失了指向它的节点。pre
节点记录好上一个k
链的尾部节点,在这一次翻转完之后,再将上一次的pre
指向这一次翻转完之后的头部,这样就可以完成前后相连的问题了。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public void reverseList(ListNode head, ListNode tail){ ListNode prev = null; ListNode p = head; while(prev!=tail){ ListNode nxt = p.next; p.next = prev; prev = p; p = nxt; } } public ListNode reverseKGroup(ListNode head, int k) { if (head == null || k < 2) { return head; } ListNode node = new ListNode(0); node.next = head; ListNode pre = node; ListNode tail = node; while (head!=null) { int cnt = 0; while(cnt<k){ cnt++; tail = tail.next; if(tail==null) return node.next; } ListNode nxt = tail.next; reverseList(head, tail); ListNode tmp = head; head = tail; tail = tmp; tail.next = nxt; pre.next = head; pre = tail; head = nxt; } return node.next; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。