LeetCode 25: Reverse Nodes in k-Group

来源:互联网 发布:dos命令执行java程序 编辑:程序博客网 时间:2024/06/13 22:46

原题链接在此:https://leetcode.com/problems/reverse-nodes-in-k-group/

这题是第24题——交换相邻节点的升级版。这道题想到思路并不难,也是比较自然的,但是在写的时候要注意一些边界条件、临时变量的选取和作用域等细节,容易写错。

算法思路是:把k个节点当做一个group,一次尝试遍历k个节点,若能找到这个group的尾节点,则把这个group的节点翻转,否则不翻转。

    public ListNode reverseKGroup(ListNode head, int k) {        ListNode lastGroupHead = null;        ListNode nextGroupHead = head;        // 要返回的链表的头节点        ListNode listHead = null;        ListNode currGroupHead = null;        // 若有下一个group head的时候        while (nextGroupHead != null) {            ListNode currGroupTail = null;            // 当前group翻转过后的新头节点            ListNode newGroupHead = null;            lastGroupHead = currGroupHead;            currGroupHead = nextGroupHead;            nextGroupHead = null;            ListNode temp = currGroupHead;            // 当前group的节点计数            int groupNum = 0;            // 尝试找当前group的tail            while (true) {                if (temp == null)                    break;                groupNum++;                if (groupNum == k) {                    // 找到了当前group的尾节点                    currGroupTail =temp;                    nextGroupHead = currGroupTail.next;                    break;                }                temp = temp.next;            }            // 若找到了group tail,则reverse这个group            if (currGroupTail != null) {                ListNode prev = null;                ListNode curr = currGroupHead;                ListNode next = currGroupHead.next;                while (true) {                    curr.next = prev;                    if (curr == currGroupTail)                        break;                    prev = curr;                    curr = next;                    next = next.next;                }                newGroupHead = currGroupTail;            }            else            {                newGroupHead = currGroupHead;            }            // listHead初始化为第一个group头节点            if (listHead == null)                listHead = newGroupHead;            // 上个group尾部连接到这个group            if (lastGroupHead != null)                lastGroupHead.next = newGroupHead;        }        return listHead;    }

这里有人提出了更简洁的解法,主要思想是:一是加入空节点作为头节点,二是将翻转group的逻辑封装成一个函数:http://www.cnblogs.com/lichen782/p/leetcode_Reverse_Nodes_in_kGroup.html

原创粉丝点击