`
y806839048
  • 浏览: 1121639 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

链表的反转(复杂程序的编写方式)

阅读更多

 

链表反转:

 

思路一:

 

利用q p(移动,前后相对位置不变(套换工具))重置相邻节点的指针方向,r(移动,执行循环)标志剩下需要调整的链

  对象是引用传递,不是值引用

 

 

    //链表倒转---围绕核心操作展开一系列操作的编程方式,先编核心,然后缺的再补

 

  1,当前节点的下一节点的指向指向前一节点,由此引出修改当前节点下一节点指向时需要备份下一节点(实现备份与移位)

  2,前一节点移到当前节点,当前节点移到下一节点(通过赋值实现移位)

 

 类似编程方式2--树的遍历

     先画出思路图,然后一级一级需求实现,缺的后面补,重复的抽象

 

在画界线,粒度的时候最好每部分做不同的事情相互不参杂,然后再调整

 

 

  参考:

  https://www.cnblogs.com/mafeng/p/7149980.html

 

 

思路二:

  通过上一节点,当前节点,下一节点,三点的顺序移动的过程改变指向(没循环一次变一次指向),最后返回前一节点(到了最后节点之后,在会进入一次循环,此时下一节点是空,前一节点就是最后一节点

  )

顺序变动的全部在循环内赋值,只有开始传入的头在循环外赋值为当前节点

 

 

public class Node<E> {

   

   private E data;

 

   private Node<E> next;

 

   public Node(E node){///构造函数指赋值数据变量

       this.data=data;

   }

 

   public E getData(){

      return data;

   }

 

   public void setData(E data){

     this.data=data;

   

   }

 

   public Node getNext(){

       return next;

   }

 

 

   public void setNext(Node<E> next){

   this.next=next;

   

   }

    

 

}

 

 //指针遍历用迭代,树形最好用递归

 

public  static  Node<String> reverseList(Node<String> head){

 

     if(head ==null){

         return null;

     }

 

     if(head.getNext() ==null){

        return head;

     }

 

     //上面情况校验通过才可以进入倒转

 

     Node<String> preNode = null;

     Node<String> curNode =head;

     Node<String>  nextNode=null;

 

     while(curNode !=null){   //校验最后一个节点跳出

 

        nextNode = curNode.getNetx(); //操作之前备份出来,一个闭环,重新指向当前节点,当前节点的下一个即可实现三个节点的移动,先改当前节点下的下一节点,再改当前节点,实现next备份与移位

 

curNode.setNext(preNode);    //改变指向---倒转关键,next为preNode的引用,之后preNode变了,这里的不会变(值引用--值的副本(基本类型),对象引用--原始地址对象--赋值之后中间变量变了,之前赋值的不会变

 

preNode = curNode;   //实现prenode移位

 

curNode=nextNode;  //实现curnode移位

 

 

     

     

     

     }

 

 

   return preNode;

 

 

 

}

 

 

 

public class mainRun{

 

         public static void main(String[] arg0){

            Node node0 = new Node("1");

    Node node1 = new Node("2");

    Node node2 = new Node("3");

 

    node0.setNext(node1);

    node1.setNext(node2);

 

    Node head1 = node0;

 

           while(head1 !=null){

      head1=head1.getNext();

   }

 

           Node oldHead = node0;

   Node newHead = reverseList(oldHead);

 

   while(newHead !=null){

      newHead= newHead.getNext();

   }

 

 

 

}

 

 

 

 

}

 

 

 

参考

 

 

https://blog.csdn.net/qq_24692041/article/details/62424548

 

 

分享到:
评论

相关推荐

    java链表的程序

    Java链表是一种基础且重要...通过编写和测试链表程序,你可以加深对数据结构的理解,这对于提高编程能力和解决复杂问题至关重要。同时,掌握链表对于准备Java相关的技术面试也十分有益,因为链表题目常常出现在面试中。

    从尾到头打印链表(C语言实现)

    在计算机科学中,链表是一种常见的数据结构,用于存储一系列有序元素。在链表中,元素不是连续存储的,而是通过指针连接。...这些概念和技能在数据结构与算法的学习中非常重要,对于理解和编写复杂程序具有基础性作用。

    实验二 链表基本操作的实现

    6. 反转链表:这是一项高级操作,需要重新分配每个节点的指针,使其指向其前一个节点,从而实现链表的反转。 7. 合并链表:两个有序链表的合并,可以实现高效的数据整合,通常从较小的链表开始,依次添加节点到较大...

    用C++程序写一个链表程序

    本教程将详细讲解如何使用C++编写链表程序,包括链表的基本概念、节点定义、插入操作、删除操作以及其它常见操作。 ### 1. 链表的基本概念 链表不同于数组,它不连续存储数据。每个链表节点包含两部分:数据元素和...

    倒置——链表(附源代码)

    总的来说,这个程序提供了理解和实践链表反转操作的机会,这对于学习数据结构和算法的初学者来说是非常有价值的。通过解决这样的问题,可以深入理解链表的内部工作原理,提高编程技巧,并为处理更复杂的数据结构问题...

    用C++编写的双向链表程序示例.doc

    实际应用中,双向链表还可以进行更复杂的操作,例如插入节点、排序链表(可以是冒泡排序、快速排序等)、查找特定节点、反转链表等。理解双向链表的工作原理及其操作方法对于深入掌握数据结构和算法至关重要,这对于...

    自己写的c程序,链表的所有操作都有

    在"链表的综合操作.cpp"中,可能涵盖了链表的基本操作,如创建、插入、删除、遍历和反转链表。这有助于理解动态数据结构的原理和操作。 2. **大数相加相乘**:"大数相加相乘.cpp"涉及到大整数的运算,因为标准C++库...

    一个简单的链表,这个是一个很简单的但是非常使用的一个静态链表

    静态链表是链表的一种实现方式,与动态链表相对,它们都是用来存储和管理一系列元素的有效手段。 静态链表,顾名思义,它的存储空间是在程序编译期间就预先分配好的。与动态链表不同,动态链表的节点可以在运行时...

    《数据结构与算法》课程上机实验二(链表)_链表_fruitd55_C++_数据结构与算法_

    在计算机科学中,数据结构与算法是至关重要的基础,它们直接影响到程序的效率和性能。本次上机实验主要关注的是链表,一种常用的数据结构,它在C++中有着广泛的应用。链表不同于数组,其元素不是连续存储的,而是...

    数据结构单链表实例一个简单的小程序

    在这个“数据结构单链表实例一个简单的小程序”中,我们可以推测作者实现了一个用C语言编写的单链表操作程序,可能包括创建、插入、删除和遍历等基本操作。 单链表的特点在于它的每个节点只有一个指向后继节点的...

    程序设计-链表的展示.pptx

    总之,链表是程序设计中不可或缺的一部分,它提供了灵活的数据存储方式。理解链表的内部工作原理,尤其是如何遍历和打印链表,对于学习更复杂的算法和解决实际问题具有重要意义。希望你在练习链表操作的过程中能够...

    数据结构 双向链表存储

    在计算机科学中,数据结构是组织、管理和存储数据的方式,它是算法设计的基础。...这对于理解和开发复杂的数据结构和算法至关重要,特别是在处理大量数据时,高效的数据结构可以显著提升程序性能。

    数据结构链表排序数据结构课设,链表排序,升序,逆序,倒置

    在IT领域,数据结构是计算机科学的基础之一,它...在实际开发中,理解并熟练掌握这些基础数据结构和算法,能够优化程序性能,解决复杂问题。通过这个课设,你可以深入探究链表内部工作机制,锻炼逻辑思维和编程技巧。

    单项动态链表

    添加节点到链表通常有两种方式:在链表末尾(追加)或在链表开头(插入)。在C语言中,这可以通过遍历链表找到适当的位置并更新指针来完成。 例如,要在链表末尾添加节点,可以编写如下代码: ```c void append...

    算法-理论基础- 线性表- 循环链表(包含源程序).rar

    源程序可能包含了循环链表的基本操作函数的实现,如创建链表、添加元素、删除元素、打印链表等,以及可能的复杂操作,如查找某个元素、反转链表等。 在分析和编写循环链表的源代码时,需要注意以下几点: 1. 初始化...

    数据结构链表实验(c++带报告)

    7. 测试与调试:编写测试用例,验证链表操作的正确性,使用调试工具(如gdb)查找并修复程序中的错误。 8. 报告编写:实验报告应详细描述实验的目的、所采用的方法、实现的步骤、遇到的问题及解决方案,以及实验...

    C++ 递归操作 链表和整数(包括控制台IO)

    2. **链表反转**: 反转链表的递归解决方案可以分为三个步骤:处理基本情况(链表为空或只有一个元素)、将当前节点的下一个节点反转(递归调用)并调整当前节点的指针。例如,可以定义`ListNode* reverseList...

    单项链表各种操作的实现(C语言源代码VS2008)

    单项链表是数据结构中的一种基础...无论是进行算法分析、编写高效程序还是理解操作系统内核,链表都是不可或缺的知识。通过实际操作,你可以更好地掌握这些概念,并为后续更复杂的数据结构和算法学习打下坚实的基础。

    数据结构实验之双链表

    在计算机科学中,数据结构是组织、存储和处理数据的方式,它是算法的基础。双链表是一种重要的线性数据结构,它的每个元素(节点)都...在软件开发中,熟练运用数据结构能够优化算法效率,解决复杂问题,提升程序性能。

    链表和栈的基本操作及源代码

    了解和熟练掌握链表和栈的操作对于理解和编写复杂算法至关重要,特别是在动态规划、图遍历、编译器设计等领域。通过分析和实践这些源代码,你可以更深入地理解这两种数据结构的内部工作原理,提高编程技能。

Global site tag (gtag.js) - Google Analytics