首页 > 编程知识 正文

反转单向链表java,java双向循环链表

时间:2023-05-04 22:10:43 阅读:33514 作者:1920

链表这个数据的结果经常相遇。 这里提供链表反转的java代码实现。 有三种算法。 一个是递归的,另一个是非递归的。

首先,为了便于测试,在博客的末尾粘贴递归实现链表编写的代码,以便读者立即进行测试。 提供的代码可以复制并直接测试

让我们先看看节点

公共类节点{

//链表用于存储值

私有财务收入值;

//理解为Node next更适合指向下一个节点

私有节点;

公共节点(空闲) {

this.value=value;

this.node=null;

}

公共插入获取值

返回值;

}

公共节点获取节点

返回节点;

}

公共语音节点(节点节点) {

this.node=node;

}

}

复制代码

看看链表的反转递归方法

publicnodereverserlinkedlist (节点节点) {

if (node.getnode (==空||node==空) )

返回节点;

}

节点新数据=reverser linked list (node.getnode ) );

node.getNode ().setnode ) ) node;

node.set node (空;

返回新数据;

}

//该递归、返回值只是为了控制返回的是最后的节点

//并且递归地通过堆栈的特性,这里允许从最后的节点将自己的子节点改变为自己

//使自己的子节点为null

复制代码递归的实现总是这么简单,代码简洁是递归的好处,逻辑容易处理。 如果能找到一个层次的逻辑,找到特殊的值和出口,就完成一个递归

这里的出口显然是它的if,因为它可以找到最后一个节点,然后向前递归开始翻转。 此外,此if可以排除参数只有一个节点且参数为null的情况。

的递归堆栈累计到顶级时(递归的本质是堆栈,每次递归都包含一个堆栈,执行完成后弹出,执行下一个层次),在最后一个if结束后开始反转。 反转的逻辑其实很简单。 是吧。 当前节点的下一个节点指向自己,自己指向null。

解释完递归算法后,我也明白递归其实是堆栈,现在就用同样的逻辑。 它只是将递归转化为循环,用java自身实现的堆栈数据结构编写更高效的代码

publicnodereverserlinkedlist2(节点) {

堆叠节点堆叠=新堆叠(;

节点头=空;

//存储在堆栈中,模拟递归开始的堆栈的状态

wile (节点!=空) {

节点堆栈. push (node );

node=node.getNode (;

}

//对第一个堆栈顶部元素进行特殊处理(也就是说,反转前的最后一个元素位于最后,因此不需要反转)。 如果加入下面的while,则下一个节点为空(getNode ) ),则空指针异常) ) )。

if () )! nodeStack.isEmpty (

head=nodeStack.pop (;

}

//排除后可以愉快地循环

while (! nodeStack.isEmpty (

节点tempnode=node stack.pop (;

tempNode.getNode ().setnode ) ) tempnode;

tempnode.set node (空;

}

返回头;

}

复制代码

逻辑一目了然,备考上的说明已经很清楚了

另一种循环书写方式更简单,使用两个指针,不需要堆栈结构

publicnodereverserlinkedlist3(节点) {

//指向天空,被认为位于第一个节点前面

节点新节点=null;

//指向第一个节点

Node curNode=node;

//循环中,使用第3变量保存curNode后面的节点

while(curnode!=空) {

Node tempNode=curNode.getNode (;

使curNode反向向前

curnode.setnode(newnode );

//newNode向后移动

新节点=curnode;

//curNode向后移动

curNode=tempNode;

}

返回新节点;

}

复制代码

这种想法是两个指针,将一个链表分为两部分。 newNode已经是翻转的部分,curNode是翻转的部分。 然后,在两个指针的配合下,继续向右移动直到前部反转

现在,贴上其他代码部分,或者贴上链表中构建的东西

公共类链接列表创建器{

//构造函数

publicnodecreatelinkedlist (列表列表) {

if(list.isempty () ) )。

返回空值;

}

nodeheadnode=new node (list.get (0);

节点模板=创建链接列表(list.sublist (1,list.size ) );

headnode.setnode(tempnode;

返回头节点;

}

//便于测试的打印函数

publicvoidprintlist (节点) {

wile (节点!=空) {

系统. out.print (node.getvalue () );

System.out.print (' );

node=node.getNode (;

}

System.out.println (;

}

}

复制代码

主函数

publicstaticvoidmain (字符串[ ] args ) {

linkedlistcreatorlinkedlistcreator=newlinkedlistcreator (;

节点节点=linked list creator.create linked list (arrays.as list (1、2、3、4、5 ) );

节点2=linked list creator.create linked list (arrays.as list (1、2、3、4、5 ) );

节点3=linked list creator.create linked list (arrays.as list (1、2、3、4、5 ) );

linkedlistreverserlinkedlistreverser=newlinkedlistreverser (;

节点RES=linked list reverser.reverser linked list (node );

node RES2=链接列表reverser.reverser链接列表2 (node2);

节点RES3=linked list reverser.reverser linked list3(node3);

链接列表创建器. print list (RES;

链接列表创建器. print list (res2;

链接列表创建器. print list (RES 3;

}

复制代码

博文是作者原来在其他平台上的,现在正在转移

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。