zoukankan      html  css  js  c++  java
  • 【数据结构】算法 Reverse Nodes in k-Group 以K个节点为一组反转链表

    Reverse Nodes in k-Group 以K个节点为一组反转链表

    Given the head of a singly linked list and two integers left and right where left <= right, reverse the nodes of the list from position left to position right, and return the reversed list.

    Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.

    k is a positive integer and is less than or equal to the length of the linked list. If the number of nodes is not a multiple of k then left-out nodes, in the end, should remain as it is.

    Follow up:

    • Could you solve the problem in O(1) extra memory space?

    • You may not alter the values in the list's nodes, only nodes itself may be changed.

    Input: head = [1,2,3,4,5], left = 2, right = 4
    Output: [1,4,3,2,5]
    

    就是给你一个链表,k个为一组进行反转,最后不够k的就不反转了,而且k肯定小于表长。

    问题

    把大象塞到冰箱要几步?

    分解问题,

    1 首先判断这个链表有没有K个元素
    2 开始分段反转
    3 判断是否反转结束

    虚头法 dummy head+递归

    reverseN用来判断从head开始是否足够n个节点进行反转,如果不够就不处理,否则就会调用realreverseN进行反转【realreverseN将从传入的head开始的n个节点进行反转处理】,reverseN返回的是从传入的head开始到第n个节点反转后的头节点。如果reverseN最后返回的节点和p.next是同一节点表示反转结束,否则就要让p.next指向返回的节点,继续N个节点的反转处理。

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode() {}
     *     ListNode(int val) { this.val = val; }
     *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
     * }
     */
    class Solution {
        public ListNode reverseN(ListNode head,int n){
            ListNode p =head;
            int count  = n-1;
            while(count>0&&p!=null){
                p= p.next; count--;
            }
            if(p==null){ return head;}
            return realreverseN(head,n);
       }
    
        public ListNode realreverseN(ListNode head,int n){
            if(n==1){return  head;}
            ListNode tail = head.next, p = realreverseN(head.next,n-1);
            head.next=tail.next;
            tail.next =head;
            return p;
        }
        
        public   ListNode reverseKGroup(ListNode head, int k) {
            ListNode ret = new ListNode(0, head),p=ret,q=p.next;
            while ((p.next=reverseN(q,k))!=q){
                p =q;
                q =p.next;
            }
            return ret.next;
        }
    }
    
  • 相关阅读:
    7.21
    7.14
    7.7
    大学生失物招领平台使用体验及改进意见
    cdh集群迁移 ip更改
    klearn.preprocessing.PolynomialFeatures学习
    二元线性回归
    python学习之numpy.ewaxis
    sklearn.linear_model.LinearRegresion学习
    一元线性回归-梯度下降法-房价预测
  • 原文地址:https://www.cnblogs.com/dreamtaker/p/14510626.html
Copyright © 2011-2022 走看看