本篇内容主要讲解“怎么使用Java实现单链表的反转”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用Java实现单链表的反转”吧!

一、原地反转

1、新建一个哨兵节点下一结点指向头结点

2、把待反转链表的下一节点插入到哨兵节点的下一节点

反转之前的链表:1–>2–>3–>4>–>5

加入哨兵节点:dummp–>1–>2–>3–>4>–>5

原地反转:

定义:prev=dummp.next; pcur=prev.next;

prev.next=pcur.next;

pcur.next=dummp.next;

dummp.next=pcur;

pcur=prev.next;



publicStu_nodereverse_list(Stu_nodehead){if(head.next==null||head.next.next==null)returnnull;Stu_nodedump=newStu_node(-1,"");dump.next=head;Stu_nodeprev=dump.next;Stu_nodepcur=prev.next;while(pcur!=null){prev.next=pcur.next;pcur.next=dump.next;dump.next=pcur;pcur=prev.next;}returndump.next;}二、新建链表头结点插法

二、新建链表头结点插法:

新建一个头结点,遍历原链表,把每个节点用头结点插入到新建链表中。最后,新建的链表就是反转后的链表。

publicStu_nodereverse_list1(Stu_nodehead){//新建一个新的链表的头结点Stu_nodedump=newStu_node(-1,"");Stu_nodepcur=head;//遍历待反转链表,头结点插入到新的链表中while(pcur!=null){Stu_nodepnext=pcur.next;pcur.next=dump.next;dump.next=pcur;pcur=pnext;}//新链表头结点不是需要返回的数据,因此返回头结点的下一节点returndump.next;}三、利用栈结构实现链表的反转

由于栈结构存储数据是先进后出(后进先出)也可以通过栈达到反转链表的目的。

publicStu_nodereverse_stack(Stu_nodehead){Stack<Stu_node>stack=newStack<>();Stu_nodetemp=head;//链表入栈while(temp!=null){stack.push(temp);temp=temp.next;}//取出栈中的一个节点当做新的链表的头结点Stu_nodenew_head=stack.pop();Stu_nodecur=new_head;//出站while(!stack.isEmpty()){Stu_nodenode=stack.pop();//将出站的节点指向取消node.next=null;//将新的链表串起来cur.next=node;cur=node;}returnnew_head;}四、完整代码奉上

importjava.util.Stack;publicclassrevere_node{publicstaticvoidmain(String[]args){LinkedNodelist=newLinkedNode();Stu_nodenode1=newStu_node(1,"张三");Stu_nodenode2=newStu_node(2,"李四");Stu_nodenode3=newStu_node(3,"王二");Stu_nodenode4=newStu_node(4,"麻子");Stu_nodenode5=newStu_node(5,"赵六");//打印添加节点之前的链表list.print();//尾结点添加节点list.add(node1);list.add(node2);list.add(node3);list.add(node4);list.add(node5);//打印添加加点之后的链表list.print();System.out.println("-------------------");//定义一个头结点接收调用函数返回的头节点Stu_nodehead=list.reverse_stack(list.head);//遍历输出每个节点while(head.next!=null){System.out.println(head);head=head.next;}}}//定义一个链表的操作类classLinkedNode{//定义一个头结点Stu_nodehead=newStu_node(-1,"");//添加链表的方法publicvoidadd(Stu_nodenode){Stu_nodetemp=head;while(true){if(temp.next==null)break;temp=temp.next;}temp.next=node;}//打印链表publicvoidprint(){Stu_nodetemp=head.next;if(head.next==null){System.out.println("此链表为空");}while(temp!=null){System.out.println(temp);temp=temp.next;}}//原地反转publicStu_nodereverse_list(Stu_nodehead){if(head.next==null||head.next.next==null)returnnull;Stu_nodedump=newStu_node(-1,"");dump.next=head;Stu_nodeprev=dump.next;Stu_nodepcur=prev.next;while(pcur!=null){prev.next=pcur.next;pcur.next=dump.next;dump.next=pcur;pcur=prev.next;}returndump.next;}//新建一个新的链表,头结点插入法实现链表的反转publicStu_nodereverse_list1(Stu_nodehead){Stu_nodedump=newStu_node(-1,"");Stu_nodepcur=head;while(pcur!=null){Stu_nodepnext=pcur.next;pcur.next=dump.next;dump.next=pcur;pcur=pnext;}returndump.next;}//利用栈实现反转链表publicStu_nodereverse_stack(Stu_nodehead){Stack<Stu_node>stack=newStack<>();Stu_nodetemp=head;//链表入栈while(temp!=null){stack.push(temp);temp=temp.next;}//取出一个节点当做新的链表的头结点Stu_nodenew_head=stack.pop();Stu_nodecur=new_head;//出站while(!stack.isEmpty()){Stu_nodenode=stack.pop();//将出站的节点指向取消node.next=null;//将新的链表串起来cur.next=node;cur=node;}returnnew_head;}}//节点类classStu_node{intnum;Stringname;Stu_nodenext;//重写toString方法,显示节点数据@OverridepublicStringtoString(){return"Stu_node{"+"num="+num+",name='"+name+'''+'}';}publicStu_node(intnum,Stringname){this.num=num;this.name=name;}}

到此,相信大家对“怎么使用Java实现单链表的反转”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!