翻转双链表

作者: 人魔七七 | 来源:发表于2018-11-03 14:20 被阅读70次

思路

有很多方法这个是交换每个结点的前后指针
还有递归
头/尾插法
利用栈的特性

复杂度

// 时间复杂度: O(n)
// 空间复杂度: O(1)

代码

- (void)reverseList
{
    
    //把tail指向头部结点 目的在于tail 和 head交换
    self.current = self.head;
    self.tail = self.current;
    
    //临时的变量 思路是交换每个结点的前后指针
    DSNode *previousNode = nil;
    DSNode *nextNode     = nil;
    while (self.current) {
        //把当前结点的后面的结点保存 防止链表断裂
        nextNode          = self.current.next;
        
        //下面两行代码交换指针 实现了
        //当前结点下个结点指向前驱结点
        self.current.next = previousNode;
        //当前界定啊的上个结点指向下个结点
        self.current.prior = nextNode;
        
        //前驱结点和当前结点后移一位
        //前驱结点指向当前结点
        previousNode      = self.current;
        //当前结点指向下个结点
        self.current      = nextNode;
    }
    //头部结点指向当前结点的前驱
    self.head = previousNode;
     
}

用图来描述他的过程

原始的双链表 和 翻转后的双链表


  • 第一步: tail指针指向了head 所指向的结点

  • 第二步:多次循环 交换结点前后指针 然后指针后移一位

  1. 第一次循环


  2. 第二次循环


  3. 第三次循环



    4.第四次循环:



    注意下次循环因为current 结点指向nil, 所以结束,这个就是临界点。
  • 第三步:head 指向 了node3也就是pre所指向的结点

注意:一些注意的地方代码都有注释。

相关文章

  • 翻转双链表

    思路 有很多方法这个是交换每个结点的前后指针还有递归头/尾插法利用栈的特性 复杂度 // 时间复杂度: O(n)/...

  • 链表的操作和算法相关

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

  • 翻转链表

    翻转链表 描述翻转一个链表 样例给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->nul...

  • 25. K 个一组翻转链表

    K个一组反转链表 翻转链表给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k 是一个正整数,它...

  • 链表翻转

    给定单向链表,返回翻转后的链表

  • 链表

    1.翻转链表链表的定义 翻转 快慢指针找链表 的中间位置 3.有序链表的合并 4.判断链表中是否有环解法1: 借助...

  • Swift - LeetCode - 翻转链表

    题目 翻转链表 问题: 翻转链表中第m个节点到第n个节点的部分 说明: m,n满足1 ≤ m ≤ n ≤ 链表长度...

  • K 个一组翻转链表(递归,Kotlin)

    25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k 是一个正整数,它...

  • leetcode第九十二题—反转链表 II

    又是一道升级题,还记得原来的翻转链表嘛,这个是要求指定m和n翻转链表。或许你忘了链表翻转怎么做,我编一个口诀:要问...

  • 【LeetCode】25.K个一组翻转链表

    题目描述 25.K个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k是一个正整数...

网友评论

    本文标题:翻转双链表

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