菜鸟学习数据结构算法之路之翻转链表与利用递归翻转链表

来源:互联网 发布:网络市场调研的优势 编辑:程序博客网 时间:2024/06/09 17:15

说起链表,我觉得算是挺难的吧,指针域啊,数据域,傻傻分不清楚,不过我觉得学习数据结构这一方面,自己动动手画一画其实就很清楚了,链表由数据域与指针域组合而成,两个元素,指针域呢负责连接下一个结点,数据域负责存储数据,我觉得想要理解链表,就必须知道它的指针域是如何指向下一个结点的,其实也很简单,动手画,然后跟上画出来的图就知道代码怎么写了。。

以下放出代码,个人觉得,本人的注释有点笨拙,希望看到的过客不要介意,可能难以理解,不过我相信各位如果动手画一画链表,再加以代码注释应该能理解

//翻转链表struct node{    int payload;    node *next;};//递归翻转链表node* reverse_recursive(node *head){    if (head == nullptr || head->next == nullptr){  //判断头节点        return head;    }    node* second = head->next;          //新建头节点的下一个结点 second    node* new_head = reverse_recursive(second); //递归调用,使second变为新的头节点    second->next = head;        //新的头节点的指针域与 老的头节点连接    head->next = nullptr;                   //老的头节点指为null    return new_head;}//非递归翻转链表node *reverse(node* head){    if (head == nullptr || head->next == nullptr){        return head;    }    node* p = head->next;           node* p_p = head;           //p_p为头节点    head->next = nullptr;       //把头节点的下一个节点赋为空,如果是空就不会进入循环,说明翻转完了    while (p != nullptr){        node* p_next = p->next; //p的下一个结点设置为p_next        p->next = p_p;          //把p指针指向了 p_p,建立连接        p_p = p;                //调换位置,把结点全部向前移动        p = p_next;    }    return p_p;}int main(void){    node *head = nullptr;    //添加十个节点    for (int i = 0; i < 10; i++){        node *new_node = new node;        new_node->payload = i * 10;        new_node->next = head;        head = new_node;    }    //递归调用翻转函数    //head = reverse_recursive(head);    //非递归调用    head = reverse(head);    //输出链表    node *iterator = head;    while (iterator){        cout << iterator->payload << endl;        iterator = iterator->next;    }    system("pause");    return 0;}

再放一张画的图吧,,图有点抽象,还是希望各位能自己动手画一画,希望各位能谅解…
非递归实现链表翻转

递归实现链表翻转