【算法系列之十一】k个一组翻转链表
生活随笔
收集整理的這篇文章主要介紹了
【算法系列之十一】k个一组翻转链表
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
給出一個(gè)鏈表,每?k?個(gè)節(jié)點(diǎn)一組進(jìn)行翻轉(zhuǎn),并返回翻轉(zhuǎn)后的鏈表。
k?是一個(gè)正整數(shù),它的值小于或等于鏈表的長(zhǎng)度。如果節(jié)點(diǎn)總數(shù)不是?k?的整數(shù)倍,那么將最后剩余節(jié)點(diǎn)保持原有順序。
示例 :
給定這個(gè)鏈表:1->2->3->4->5
當(dāng)?k?= 2 時(shí),應(yīng)當(dāng)返回:?2->1->4->3->5
當(dāng)?k?= 3 時(shí),應(yīng)當(dāng)返回:?3->2->1->4->5
public class ReverseNodesInkGroup {public static void main(String[] args) {// 1 -> 2 -> 3 -> 4 -> 5ListNode node1 = new ListNode(1);ListNode node2 = new ListNode(2);ListNode node3 = new ListNode(3);ListNode node4 = new ListNode(4);ListNode node5 = new ListNode(5);node1.next = node2;node2.next = node3;node3.next = node4;node4.next = node5;ListNode reverseKGroup = reverseKGroup(node1, 3);System.out.println("=================");while (reverseKGroup != null) {System.out.println(reverseKGroup.val);reverseKGroup = reverseKGroup.next;}}public static ListNode reverseKGroup(ListNode head, int k) {ListNode currentNode = head;int count = 0;while (currentNode != null && count != k) { // 每k個(gè)節(jié)點(diǎn)一組分隔currentNode = currentNode.next;count++;}if (count == k) {currentNode = reverseKGroup(currentNode, k);/// 遞歸的解決子問(wèn)題while (count-- > 0) { // 將頭節(jié)點(diǎn)從鏈表中切掉,放在下一組鏈表的前端,切除k次,即可將鏈表翻轉(zhuǎn)ListNode temp = head.next; // 保存該組鏈表的第二個(gè)節(jié)點(diǎn)head.next = currentNode; // head節(jié)點(diǎn)的下一位指向currentNode(第一次循環(huán)時(shí)是下一組鏈表的頭節(jié)點(diǎn),之后每截取一次就往前移)currentNode = head; // currentNode節(jié)點(diǎn)前移到headhead = temp; // head節(jié)點(diǎn)重新指向該組的第一個(gè)節(jié)點(diǎn),開(kāi)始下次循環(huán)}head = currentNode; //最終,該段的所有節(jié)點(diǎn)將會(huì)截空,head應(yīng)指向currentNode}return head;}}?
總結(jié)
以上是生活随笔為你收集整理的【算法系列之十一】k个一组翻转链表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《帝友 P2P 网络借贷系统》
- 下一篇: 32通过rs485烧写程序_28027芯