zoukankan      html  css  js  c++  java
  • 43-Reverse Nodes in k-Group

    1. Reverse Nodes in k-Group My Submissions QuestionEditorial Solution
      Total Accepted: 58690 Total Submissions: 212820 Difficulty: Hard
      Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.

    If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.

    You may not alter the values in the nodes, only nodes itself may be changed.

    Only constant memory is allowed.

    For example,
    Given this linked list: 1->2->3->4->5

    For k = 2, you should return: 2->1->4->3->5

    For k = 3, you should return: 3->2->1->4->5

    当之无愧的难题,其实思路比较简明,但是要写出完全无bug的代码简直太难了,改了很多遍才改到无bug,因为里面的指针运算太多了,一不注意就掉坑了,改变了指针所向内容的next,确仍然引用

    结果:
    Submission Details

    81 / 81 test cases passed.

    Status: Accepted

    Runtime: 24 ms

    beats:41.82%

    思路:找到每一段末尾标记,然后该段范围内进行逆转,同时保留逆转后的末尾元素。

    class Solution {
    public:
        ListNode* reverseKGroup(ListNode* head, int k) {
            if(head==NULL||head->next==NULL||k==1)return head;
            ListNode *fir=head,*sec=head,*pre_fir=NULL,*pre_sec=NULL;
            int finished=0;
            int count=1;
            while(!finished){
                int i=1;
                while(i++<k&&sec!=NULL){sec=sec->next;} //fir.....sec段总的K个元素
                ListNode *sec_next=(sec==NULL)?NULL:sec->next;
                if((i-1)==k&&(sec!=NULL)){          //注意,只有当找了k次且最后一次找到了(不为空)才进行这段元素原地逆转
                    ListNode *tmp = fir->next;   //逆转时的当前元素
                    ListNode *prenode = fir;   //逆转时保留的前一元素
                    while(tmp!=sec_next) //当前元素没到sec末尾元素,
                    {  
                        ListNode *nextnode = (tmp->next); //保存当前元素的下一元素
                        tmp->next = prenode;          //当前元素指向前一个元素
                        prenode = tmp;                //前一元素右移
                        tmp = nextnode;               //当前元素右移
                     }
                     fir->next = NULL;         //第一段的首元素变成末尾元素。
                     if(pre_fir!=NULL){pre_fir->next = prenode;pre_fir = fir;}//pre_fir上一段逆转后的末尾指向当前的逆转后的开头
                     else {head = prenode;pre_fir=fir;}//针对第一次前一段的逆转前的为空
                     fir = sec_next;  //开始下一段元素逆转,sec_next保存上一段sec的下一元素
                     sec = fir;      //将sec置为fir一样的值,开始逆转流程。
                }
                else {
                        finished = 1;
                        if(pre_fir!=NULL)pre_fir->next = fir;
                }
            }
            return head;
        }
    };
  • 相关阅读:
    JavaWeb学习笔记--2.3内置对象
    JavaWeb学习笔记--2.jsp指令元素、动作元素、内置对象
    JavaWeb学习笔记--Servlet代码集
    JavaWeb学习笔记--HttpServletRequest、HttpServletResponse对象常用方法
    JavaWeb学习笔记-使用HttpSession对象跟踪会话
    Servlet接收JSP参数乱码问题解决办法
    Java笔记--File,FileInputStream,FileReader,InputStreamReader,BufferedReader 的使用和区别
    Java笔记--java一行一行写入或读取数据
    Java笔记--Java的List、Iterator用法
    Scala学习笔记--List、ListBuffer
  • 原文地址:https://www.cnblogs.com/freeopen/p/5482923.html
Copyright © 2011-2022 走看看