美文网首页
单链表翻转

单链表翻转

作者: 90后小伙 | 来源:发表于2018-07-04 16:08 被阅读11次

单链表的就地逆置:
就地逆置即空间复杂度为O(1)
一:用数组存储单链表的值,然后重新逆序赋值,效率较低。
二:利用三个指针,在原来的基础上进行逆序。这种方法比较实用,效率也高。
三:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。需要新建一个链表,这种方法和第二种差不多。

解法一:
将头结点摘下,然后从第一结点开始,依次前插入到头结点的后面(头插法建立单链表),直到最后一个结点为止

void reverseList1(LinkList *l) {
    LinkList p, temp;  //p为工作指针,temp为p的后继,以防断链
    p = (*l)->next;  //从第一个元素结点开始
    (*l)->next = NULL;  //将L的next域置为null
    while (p) {
        temp = p->next;  //暂存p的后继
        p->next = (*l)->next; //将p结点插入到头结点之后
        (*l)->next = p;
        p = temp;
    }
}

解法二:
假设pre,p和r指向3个相邻的结点,假设经过若干操作,pre之前的结点的指针都已调整完毕,他们的next都指向其原前驱结点。现在令p结点的next域指向pre结点,为防止p的后继结点断开,用r来指向原*p的后继结点。
处理时注意两点:
一,在处理第一个结点时,应将next域置为NULL,应为要作为新表的尾结点
二,处理完最后一个结点,要将头结点的指针指向它。

void reverseList2(LinkList *l) {
    LinkList pre, cur, next; //前驱,中间,后继节点
    pre = (*l);
    cur = pre->next;
    while (cur) {
        next = cur->next;
        cur->next = pre;
        pre = cur;
        cur = next;
    }
    //这里翻转完成之后起初的头结点就是尾节点了。
    (*l)->next = NULL;
    (*l) = pre;
}

单链表的逆序输出:

void R_Print(LinkList L){
        if(L->next) {
             R_print(L->next);
        }
        print(L->data);
}

相关文章

  • 翻转单链表

    翻转单链表 方法一:将单链表头插到一个新链表中 浪费空间,不过简单 方法二:使用三个指针遍历单链表,逐个点进行翻转...

  • 单链表反转的递归方法和非递归方法

    链表的节点可以定义为: 测试的输入数据,每次使用root作为方法的入参 使用循环来翻转单链表 思路 翻转单链表,其...

  • 链表的操作和算法相关

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

  • 单链表翻转

    单链表的就地逆置:就地逆置即空间复杂度为O(1)一:用数组存储单链表的值,然后重新逆序赋值,效率较低。二:利用三个...

  • 单链表翻转

  • 翻转单链表

    在有关链表的题目中,最需要注意的地方就是各个结点引用的调整,否则很容易因为混乱的指向导致死循环等情况。 技巧:定义...

  • 单链表翻转

    循环 递归

  • 翻转单链表

  • 翻转单链表

    结果: 完整测试代码:

  • Reverse LinkList

    问题 翻转单链表举例:原始链表: 1->2->3->4就地翻转,翻转后: 4->3->2->1 主要思路 需要两个...

网友评论

      本文标题:单链表翻转

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