递归、非递归 反转单链表

定义链表结构

struct ListNode
{
    int val;
    ListNode *next;
    ListNode(int v) : val(v), next(NULL) {}
};

非递归反转单链表

ListNode* reverse(ListNode *root)
{
    if (root == NULL || root->next == NULL)
        return root;
    ListNode *cur = root->next;
    root->next = NULL;
    while (cur != NULL)
    {
        ListNode *tmp = cur->next;
        cur->next = root;
        root = cur;
        cur = tmp;
    }
    return root;
}

递归反转单链表

void reverseRec(ListNode *root, ListNode *&head)
{
    if (root == NULL)
        return;
    if (root->next == NULL)
    {
        head = root;
        return;
    }
    reverseRec(root->next, head);
    root->next->next = root;
    root->next = NULL;
}

测试

#include <iostream>
using namespace std;
struct ListNode
{
    int val;
    ListNode *next;
    ListNode(int v) : val(v), next(NULL) {}
};
ListNode* createList(ListNode *root)
{
    if (root == NULL)
    {
        ListNode *root = new ListNode(0);
        ListNode *p1 = new ListNode(1);
        ListNode *p2 = new ListNode(2);
        root->next = p1;
        p1->next = p2;
        return root;
    }
}
void tranverse(ListNode *root)
{
    while (root != NULL)
    {
        cout << root->val << " ";
        root = root->next;
    }
    cout << endl;
}
void deleteList(ListNode *root)
{
    while (root != NULL)
    {
        delete root;
        root = NULL;
    }
}
ListNode* reverse(ListNode *root)
{
    if (root == NULL || root->next == NULL)
        return root;
    ListNode *cur = root->next;
    root->next = NULL;
    while (cur != NULL)
    {
        ListNode *tmp = cur->next;
        cur->next = root;
        root = cur;
        cur = tmp;
    }
    return root;
}
void reverseRec(ListNode *root, ListNode *&head)
{
    if (root == NULL)
        return;
    if (root->next == NULL)
    {
        head = root;
        return;
    }
    reverseRec(root->next, head);
    root->next->next = root;
    root->next = NULL;
}

int main()
{
    ListNode *root = createList(root);
    //ListNode *root = NULL;
    tranverse(root);
    root = reverse(root);
    tranverse(root);

    ListNode *head = NULL;
    reverseRec(root, head);
    tranverse(head);

    deleteList(head);
}

时间: 2024-10-23 13:58:04

递归、非递归 反转单链表的相关文章

算法题:反转单链表

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 题目:存在一个单链表,头指针为head,实现单链表的反转Node *Reverse(Node *head).  该算法的求解办法有很多,如: 方法1:先顺序变量单链表,将结点保存到栈中,在从栈中弹出结点,重新建立一个新的单链表: 方法2:用<剑指offer>里面给出的算法,用三个指针来实现: 方法3:采用递归实现,是方法2的递归实现形式. 本文主要给出方法2和方法3,在给出具体的代码之前,先要注意几个问题:          (1)如果hea

快速排序递归非递归队列堆栈实现

递归实现 #include<iostream> using namespace std; template <class T> void QuickSort(T A[],int left,int right) { if(left<right) { int i=left; int j=right+1; do { do i++;while(A[i]<A[left]); do j--;while(A[j]>A[left]); if(i<j) Swap(A[i],A

二叉树总结—建树和4种遍历方式(递归&amp;&amp;非递归)

今天总结一下二叉树,要考离散了,求不挂!二叉树最重要的就是 建立.4种遍历方式,简单应用,如何判断两颗二叉树是否相似 二叉树分为 :1.完全二叉树  2.满二叉树 结构性质: 1).满二叉树 高度为h ,节点数则为 2^h - 1,且叶子节点全在最下层,且叶子节点数为2^(n-1)个{n代表二叉树层数,也叫深度} 2).n个节点的 完全二叉树 深度为 int(log2n)(以2为底n的对数)+ 1: 3).非空二叉树 叶子节点个数==双分支节点数+1 4).非空二叉树 某节点编号 n  若有左孩

【算法拾遗】二分查找递归非递归实现

转载请注明出处:http://blog.csdn.net/ns_code/article/details/33747953 本篇博文没太多要说的,二分查找很简单,也是常见常考的查找算法,以下是递归非递归的实现. 非递归实现: /* 非递归实现,返回对应的序号 */ int BinarySearch(int *arr,int len,int key) { if(arr==NULL || len<1) return -1; int low = 0; int high = len-1; while(l

C语言:【单链表】逆置反转单链表

#include<stdio.h> #include<assert.h> #include<stdlib.h> typedef int DataType; typedef struct SListNode {     DataType data;     struct SListNode* next; }SListNode; SListNode* BuyNode(DataType x) {     SListNode* next = (SListNode*)malloc

【LeetCode-面试算法经典-Java实现】【092-Reverse Linked List II(反转单链表II)】

[092-Reverse Linked List II(反转单链表II)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Reverse a linked list from position m to n. Do it in-place and in one-pass. For example: Given 1->2->3->4->5->NULL, m = 2 and n = 4, return 1->4->3->2->

反转单链表并验证(详解)

单链表优点: 可以动态增加和删除. 不需要定义初始大小. 点链表缺点: 不能随机访问.需要逐个遍历直到找到目标项. 用到动态内存分配和指针,代码复杂度提升,内存泄漏和内存段错误风险提升. 开销大较大,因为是动态分配内存.而且每项需要存储一个额外的指针. 定义单链表: ------------------------------ ------------------------------ | | | \ | | | | val | next |--------------| val | next

Java反转单链表(code)

主要是面试中可能会经常碰上该类似操作,尤其是稍大点公司,面试官可能并不在乎你能不能搞定该题,但是这类型题目最是能体现程序员的思维状态 ---一个迷糊头脑的程序员 怎能立志改变这个世界 /** * @author luochengcheng * 定义一个单链表 */ class Node { //变量 private int record; //指向下一个对象 private Node nextNode; public Node(int record) { super(); this.record

Java实现二叉树的创建、递归/非递归遍历

近期复习数据结构中的二叉树的相关问题,在这里整理一下 这里包含: 1.二叉树的先序创建 2.二叉树的递归先序遍历 3.二叉树的非递归先序遍历 4.二叉树的递归中序遍历 5.二叉树的非递归中序遍历 6.二叉树的递归后序遍历 7.二叉树的非递归后序遍历 8.二叉树的层次遍历 这里感谢博客http://blog.csdn.net/skylinesky/article/details/6611442的指导 /**二叉树的结点定义*/ class Node<T>{ private T value; pr