LeetCode刷题系列 -- 25. K 个一组翻转链表

题目:

  

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

 

示例:

给你这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5

 

说明:

你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group
 

思路:   定义一个 pre 节点,用于指向每 k 个一组子链表的头结点的上一节点, currentNode 从子链表的头结点开始,currentNode 一直遍历直到子链表的最后一个节点,此时记录最后一个节点的下一个节点为 newCurrentNode ,子链表的头结点为 newPre ,则将子链表从原链表中解链,即令 currentNode.next = null 。

     将以 newPre 为头结点的子链表翻转,并令翻转后的子链表的头结点为 tmpHead ,

currentNode =    newCurrentNode ; // currentNode 指向新的子链表的头结点

pre.next = tmpHead; //将翻转后的子链表链接到原链表中

pre = newPre ;  // pre 指向翻转后的子链表的尾结点

pre.next = currentNode;  // 将尾节点与新的子链表的头结点相连

例子:

假设k=2

-1 -> 1->2->3->4->5
 |       |
pre   currentNode        

-1->3->2 -> 1->4->5
             |      |
           pre  currentNode

 

 

Java代码如下:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
       public ListNode reverseKGroup(ListNode head, int k) {
        ListNode  virtualHead = new ListNode(-1);
        ListNode  newHead = head;
        int len = getLen(head);
        if(len==1)
            return newHead;
        virtualHead.next = head;

        ListNode pre = virtualHead;
        ListNode currentNode = head;

        for(int i=0;i<len/k;i++) {
            int count = k;
            while (count>1){
                currentNode = currentNode.next;
                count--;
            }
            ListNode  newPre     = pre.next;
            ListNode  newCurrent = currentNode;

            newCurrent = currentNode.next;
            currentNode.next = null;
            ListNode tmpHead = reverseListNodes(pre.next);
            pre.next = tmpHead;
            currentNode = newCurrent;
            pre = newPre;
            pre.next = currentNode;
        }

        return virtualHead.next;
    }

    int  getLen(ListNode head){
        int len = 0;
        while (head!=null){
            len++;
            head = head.next;
        }
        return len;
    }

    ListNode  reverseListNodes(ListNode root){
        ListNode tmp1 = root;
        ListNode tmp2 = root.next;
        ListNode p = null;

        while (tmp1!=null){
            tmp1.next = p;
            p = tmp1;
            tmp1 = tmp2;
            if(tmp1 == null){
                break;
            }
            tmp2 = tmp2.next;
        }

        return p;

    }
}
class ListNode {
      int val;
      ListNode next;
      ListNode(int x) { val = x; }
}

 

 

   

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值