题解 | #链表中的节点每k个一组翻转#

链表中的节点每k个一组翻转

https://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */
/*
之前做过一次,强迫症的我想着能不能一次遍历(我这里的代码是两次遍历)就搞定,磕了好久没做出来。这里说下这里的思路吧。
首先要对翻转链表很熟悉,p、q、r三指针翻转链表。而每k个进行翻转,中间的就是一段链表(而不是一个单独的节点),所以应该使用两个指针标定中间一段链表的头和尾(相当于q指针一分为二了)。先创建一个冗余头节点,这样比较好操作。每次就是让pre指针(pre的后继就是subHead)后移,然后让subTail在pre后面后移k次,并检查subTail是不是null。标定subHead、rear(也就是subTail的后继)之后,pre、subHead、subTail、rear四个指针保持不变,然后从subHead顺序遍历并翻转子链表,翻转完了之后更改上述四个指针的指向就可以了。

*/
class ListNode {
    int val;
    ListNode next;
    public ListNode() {
        next = null;
    }
    public ListNode(int v) {
        val = v;
        next = null;
    }
}
public class Solution {
    /**
     * 
     * @param head ListNode类 
     * @param k int整型 
     * @return ListNode类
     */
    public ListNode reverseKGroup (ListNode head, int k) {
        if(k == 1) return head;
        ListNode pre = new ListNode();
        pre.next = head;
        ListNode subTail = pre;
        head = pre;
        while(subTail != null) {
            for(int i = 0; i < k; i++) {
                subTail = subTail.next;
                if(subTail == null) break;
            }
            if(subTail != null) {
                ListNode subHead = pre.next, rear = subTail.next;
                ListNode p = subHead, q = subHead.next; //保持四个标定位置的指针不变
                while(q != rear) {
                    ListNode r = q.next;
                    q.next = p;
                    p = q;
                    q = r;
                }
                pre.next = subTail; //更改子链表的头尾节点的连接
                subHead.next = rear;
                pre = subHead;
                subTail = subHead;
            }
        }
        return head.next;
    }
}

#23届找工作求助阵地#
全部评论

相关推荐

白菜小丑呜呜:集美,简历有点问题,+v细嗦
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务