温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java如何翻转链表

发布时间:2021-12-20 14:03:15 来源:亿速云 阅读:191 作者:iii 栏目:云计算

本篇内容介绍了“Java如何翻转链表”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

package com.lifeibigdata.algorithms.leetcode; /**  * Created by lifei on 16/6/30.  */ public class ReverseListNode {     public static void main(String[] args) {         ListNode head=new ListNode(1);         ListNode n1 =new ListNode(2);         ListNode n2 =new ListNode(3);         ListNode n3 =new ListNode(4);         //初始化链表         head.next = n1 ;         n1.next = n2;         n2.next = n3;         System.out.println("打印链表反转前:");         Utils.print(head);         ReverseListNode rln = new ReverseListNode();         System.out.println("打印链表反转后:");         ListNode newHead = rln.reverse4(head);//TODO 3种方式         Utils.print(newHead); //        System.out.println("===========create=============="); //        ListNode cln = createList(new int[]{1,2,3,4,5}); //        Utils.print(cln);     }     /**      * 第一轮      * 3.next (reverse) revHead 4      * 3.next.next=4.next(赋值前为null)   3      * 3.next -> null      * 4 3 null      *      *第二轮      * 2.next.next=3.next(赋值前为null)   2      * 2.next -> null      * 4 3 2 null      *      *      *      * @param head      * @return      */     ListNode reverse(ListNode head){         if (null == head || null == head.next){//TODO 如果是终节点,就会将终结点返回,所以revHead就是终结点             return head;         }         ListNode revHead = reverse(head.next);         System.out.println("----"+head.val+","+head.next.val+"----");         head.next.next = head;  //3.next.next(4.next,此时4是翻转后的头结点)=3    <head=3>         head.next = null;       //3.next=null         return revHead;     }     //“头插法”思想描述:从链表的第一个结点开始,以每一个结点为单位,遍历链表,将遍历到的结点依次插入到头结点的后面     ListNode reverse2(ListNode head){//TODO         if (null == head || null == head.next) {             return head;         }         ListNode pre = null;    //新链表过程中的头结点         ListNode cur = head;    //cur为遍历的游标,同时也是最后返回链表的头结点         ListNode next = cur.next;         while (next != null){   //todo cur为即将插入的节点,此处是判断循环终止的条件             cur.next = pre;     //将待插入的节点->新链表的头结点             pre = cur;          //将新插入的节点,作为下一次循环的头结点             cur = next;         //循环下一个节点             next = cur.next;    //判断新节点的下一个节点,进行循环         }         cur.next = pre;         return cur;     }     //头插法     static ListNode reverse3(ListNode head) {         if (null == head || null == head.next) {             return head;         }         ListNode nextHead = null;   //待转置的下一个节点         ListNode newHead = null;	//新链的头节点         ListNode newn = null;  	//待插入插入的节点	需要待插入的节点直接指向新链的头节点,那么返回新插入的节点,就是插入之后链的头节点         newHead = head;	//把旧头结点赋值给新头结点         head = head.next;	//此时的head已经是第二个节点         newHead.next = null;         while(head.next != null){	//此时的head是第二个节点,该节点为需要加入链表的新节点,即newn; head.next第三个节点,,             nextHead = head.next;	//下一次待转置的节点             newn = head;	//将要插入的新节点             newn.next = newHead;	//新插入的节点指向 新链的头节点             newHead = newn;	//将新插入的节点作为新链的节点             // newn.next = newHead.next; //错误的  不能用创建链表的方式,因为创建链表的方式有一个空的头节点             // newHead.next = newn;	 //错误的             head = nextHead;         }         newn = head;	//因为每次判断的是新插入节点的下一个节点,所以最后一个节点不在循环中,此时的head就是最后一个节点         newn.next = newHead;         return newn;     }     ListNode reverse4(ListNode L){//TODO         ListNode head = null;         ListNode temp ;         while (L != null){             temp = L.next;//将第二个节点赋值给tmp             L.next = head;//将第一个节点指向新的头结点             head = L;     //将新的头结点L赋值给head,用于下次循环             L = temp;     //下一次迭代中迭代的是第二个节点         }         return head;     }     /**      * 图示      * @param head      * @return      */     ListNode reverse5(ListNode head){//TODO         ListNode pRerverseHead = null;         ListNode pNode = head;         ListNode pPrev = null;         while (pNode != null){             ListNode next = pNode.next;             if (next == null){                 pRerverseHead = pNode;             }             pNode.next = pPrev;             pPrev = pNode;             pNode = next;         }         return pRerverseHead;     }     static ListNode createList(int[] values){         ListNode head = new ListNode(0);         for(int i = 0;i < values.length;i++){             ListNode node = new ListNode(values[i]);//新节点node             node.next = head.next;//将头节点的尾部转移到新节点的尾部             head.next = node;//将头结点尾部指向新节点         }         return head.next;     }     /**      *      *      打印链表反转前:      1->2->3->4->      打印链表反转后:      ----4,3----      ----3,2----      ----2,1----      4->3->2->1->      */ }

“Java如何翻转链表”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI