zoukankan      html  css  js  c++  java
  • 反转链表的递归与非递归实现(C++描述)

    给定一个单向链表的头结点,要求将链表反转,并返回新的头结点。

    一、迭代实现

    思路:遍历链表,依次调整每个节点的指针域。

     定义 结点p指向当前节点

              结点q指向当前节点的下一个结点(p->next非空时)

              结点r指向当前节点的前一个结点

             节点newhead指向新头结点()

    初始 p=head,q=NULL,r = NULL;

    当p不为空时:

                如果p->next非空  q = p->next

                 p->next = r

                 r = p

                 p = q

    最后r即为反转后链表的新头结点!

    代码实现:

    Listnode * ReverseList(Listnode *head){
        if(head->next == NULL) return head;
        
        Listnode *p,*q,*r;
        p=head;q=r=NULL;
        
        while(p!=NULL){
            //if(p->next!=NULL) 
            q = p->next;
            p->next = r;
            r = p;
            p = q;
        }
        return r;    
    }

    二、递归实现

    迭代法实现是顺序遍历从头到尾改变指针指向,递归的特性是回溯,采用从后向前改变指针指向的方式来实现链表反转。

    ListNode* reverse(ListNode* H) {
        //包括特殊情况
        if (H == NULL || H->next == NULL)
            return H;
     
        ListNode *newH = reverse(H->next);//注意,此处的操作是一直循环到链表末尾
        H->next->next = H;//反转每个节点的指向
        H->next = NULL;
     
        return newH;
    }

    参考:

    链表反转的图文讲解(递归与迭代两种实现)

  • 相关阅读:
    composer的使用
    tp5短信接口的使用
    PHP序列化与反序列化
    PHP 的oop思想
    php单例模式
    统计图的使用(chart)
    jq的时间插件
    php中Excel操作
    Linux 常用命令
    think cmfx目录结构
  • 原文地址:https://www.cnblogs.com/liuzhuan-xingyun/p/13620866.html
Copyright © 2011-2022 走看看