美文网首页
递归版非递归版翻转链表

递归版非递归版翻转链表

作者: 小幸运Q | 来源:发表于2021-04-12 19:26 被阅读0次

递归版

last指向最后一个节点5(也就是翻转结束后的头节点,递归里面直接return 不需要修改),(head.next).next=head 负责把当前的 ... -> 3 -> 4 变成 3 <- 4,然后3->null,因为它现在是队头变队尾。

#include<bits/stdc++.h>
using namespace std;
typedef struct Node{
    int id;
    Node*next;
    Node(int i){
        id=i;
        next=nullptr;
    }
}Node;
// 反转操作
Node* rev(Node* &node,int k){
    if(k==0){
        return node;
    }
    if(node->next==nullptr){
        return node;
    }
    Node*last=rev(node->next,k-1);
    node->next->next=node;
    node->next=nullptr;
    return last;
}
// 从后往前k个一组反转
Node* reverse(Node*&root,int n,int k){
    Node* Root=new Node(11);
    Root->next=root;
    Node* left;
    while(n>=k){
        left=Root;
        n-=k;
        for(int i=0;i<n;i++){
            left=left->next;
        }
        // head == left (left->next,...,tail)(tail->next,...,)
        left->next=rev(left->next,k);
    }
    return Root->next;
}
Node* Init(Node*&root,vector<int>v,int index){
    if(index>=v.size()){
        return nullptr;
    }
    else{
        if(root==nullptr){
            root=new Node(v[index]);
            root->next=Init(root->next,v,index+1);
        }
        else{
            root->next=Init(root->next,v,index+1);
        }
    }
    return root;
}
void print(Node *root){
    while(root!=nullptr){
        cout<<root->id<<"  "<<&root->id<<endl;
        root=root->next;
    }
}
int main(){
    vector<int>v{1,2,3,4,5,6,7};
    Node*root=nullptr;
    Init(root,v,0);
    root=reverse(root,v.size(),3);
    print(root);
}

非递归版

(head) (head->next,...已反转链表...,tail) (tail->next,待反转链表...)
将tail->next插入到head和head->next之间。

#include<bits/stdc++.h>
using namespace std;
typedef struct Node{
    int id;
    Node*next;
    Node(int i){
        id=i;
        next=nullptr;
    }
}Node;
Node* reverse(Node*&root,int n,int k){
    Node* Root=new Node(11);
    Root->next=root;
    Node* left;
    while(n>=k){
        left=Root;
        n-=k;
        for(int i=0;i<n;i++){
            left=left->next;
        }
        // head == left (left->next,...,tail)(tail->next,...,)
        Node* tail=left->next;
        for(int i=0;i<k-1;i++){
            Node*tailnext=tail->next;
            Node*leftnext=left->next;
            left->next=tailnext;
            tail->next=tailnext->next;
            tailnext->next=leftnext;
        }
    }
    return Root->next;
}
Node* Init(Node*&root,vector<int>v,int index){
    if(index>=v.size()){
        return nullptr;
    }
    else{
        if(root==nullptr){
            root=new Node(v[index]);
            root->next=Init(root->next,v,index+1);
        }
        else{
            root->next=Init(root->next,v,index+1);
        }
    }
    return root;
}
void print(Node *root){
    while(root!=nullptr){
        cout<<root->id<<"  "<<&root->id<<endl;
        root=root->next;
    }
}
int main(){
    vector<int>v{1,2,3,4,5,6,7};
    Node*root=nullptr;
    Init(root,v,0);
    root=reverse(root,v.size(),3);
    print(root);
}

相关文章

  • 递归版非递归版翻转链表

    递归版 last指向最后一个节点5(也就是翻转结束后的头节点,递归里面直接return 不需要修改),(head....

  • 链表的操作和算法相关

    github->demo1、创建(单链表、双链表、循环链表)2、翻转单链表(递归和非递归)3、判断链表是否存在环。...

  • 二叉树先序、 中序, 后序遍历的非递归,非递归实现

    递归版的先序,中序,后序 非递归版的遍历

  • 合并两个排序的链表

    输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 递归版 递归版详解 ...

  • 快速排序

    python版本快速排序: 1. 简洁版递归: 2. 常见版本: 3. 算法导论版: 4. 非递归版:

  • 链表

    链表问题通常可以在链表头部加入一个哑节点来减少讨论的情况。 1,翻转链表 递归 非递归 2,一个链表是否有环,环入...

  • 反转链表(java实现)

    链表反转 节点数据结构如下: 链表反转的两种方式:递归和非递归 递归方式如下: 非递归方式如下:

  • 二叉树遍历(递归+迭代)

    前序遍历 递归版 迭代版 中序遍历 递归版 迭代版 后序遍历 递归版 迭代版(这个有点难度,要记录一个prev) ...

  • java中查找算法整理

    1.顺序查找: 2.二分查找 递归实现版: 非递归实现版: 3.二叉搜索树

  • 二叉树的遍历(一)(递归和非递归)

    引言 我们不记录递归版的二叉树的遍历,我们主要研究非递归版的遍历 同一规定一下,我们树的数据结构声明如下: 非递归...

网友评论

      本文标题:递归版非递归版翻转链表

      本文链接:https://www.haomeiwen.com/subject/qvqokltx.html