美文网首页
倒置链表

倒置链表

作者: iamsonormal2333 | 来源:发表于2018-08-15 16:29 被阅读3次

题目描述:给出单向链表的头节点l,如何只遍历一次就将链表中的所有元素倒转。

算法描述:

首先给出单向链表的结构

    struct LinkList {
        int data;
        LinkList *next;
    };

遍历一次链表,对于每一个节点p,记录p的前驱pre,将p节点的后继(即next域)指向pre,即可完成倒转。

算法步骤:

1、设p节点指向头指针l的下一个节点(即指向第一个元素),pre设为NULL
2、若p的下一个节点为空,跳到4,否则跳到3
3、将q指向p的下一个节点,将p的next域指向pre节点,将pre指向p节点,将p指向q节点,跳到2
4、将p的next域指向pre节点
5、结束

实现:

    p = l->next;
    pre = NULL;
    while (p->next != NULL) {
        q = p->next;
        p->next = pre;
        pre = p;
        p = q;
    }
    p->next = pre;
    return p;

算法说明:

显然,这道题目如果通过记录data域来实现调转,算法复杂度在O(n^2)级,因为在不使用辅助数组的情况下,每次颠倒需要从头节点以O(n)的时间复杂度找到需要颠倒的节点。所以我们不妨换一个想法,从链表的next域下手。很容易想到,如果我们将每个节点的next域都指向它的前驱而不是后继,就可实现调转。我们不妨具体举例说明。

  1->2->3->4->5

假设前两个节点已经完成倒转,那么链表就可以表示成:

  1<-2 
  3->4->5

可以看出,链表变为了两部分。这时我们需要一个指针记录3的当前后继(也就是4),以完成后续遍历,之后将3的next域指向2,并记录3的位置(以便4指向3),即可完成前3个节点的倒转。

相关文章

  • 倒置链表

    题目描述:给出单向链表的头节点l,如何只遍历一次就将链表中的所有元素倒转。 算法描述: 首先给出单向链表的结构 遍...

  • 单链表倒置

    题目:将一个单链表倒置,1->2->3->4倒置成4->3->2->1题目并不难,关键是在面试中思路要清晰。 思路...

  • 单向链表的倒置

  • Java链表实现以及链表倒置

    链表一种在物理存储单元上非连续、非顺序的一种存储结构,元素通过链表中的指针链接次序实现。链表是由节点组成,每一个节...

  • 每周一道算法题(二十一)

    本周题目难度级别"hard" 题目:给你一个单向链表和一个数字k,要求将链表的每k个节点进行倒置,如链表为[1,2...

  • LeetCode 力扣 92. 反转链表 II

    题目描述(中等难度) 给定链表的一个范围,将这个范围内的链表倒置。 解法一 首先找到 m 的位置,记录两端的节点 ...

  • Java双向链表倒置功能实现过程解析

    题目要求:Java实现一个双向链表的倒置功能(1->2->3 变成 3->2->1) 提交:代码、测试用例,希望可...

  • JAVA IOC 与 DI

    依赖倒置、控制反转和依赖注入的区分 依赖倒置、控制反转和依赖注入的区分依赖倒置(Dependency Invers...

  • 倒置

    人们都知道桌子坏了用木头补,墙坏了用砖头补,可是身体坏了呢?都拿药来补,难道身体是药做成的吗?北京协和医院...

  • 倒置

    倒置 文/若兰花开 瑜伽体式中手肘倒立 是个让人上瘾的动作 随着脚尖抬起的那一刻 血液倒流能量充斥 全身满血复活的...

网友评论

      本文标题:倒置链表

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