翻转链表

作者: 奇迹迪 | 来源:发表于2018-05-29 20:46 被阅读72次

    翻转链表

    描述
    翻转一个链表

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

    思路

    1、 我们需要定义两个临时ListNode,一个保存当前节点下一个节点的地址(nextNode),一个保存当前节点上一个节点的地址(preNode)

    2、 在一次循环中,我们需要保存当前节点的下一个节点的地址(nextNode)

    2.1、我们需要更新当前节点的next指向,即指向我们保存的当前节点上一个节点的地址(preNode)

    2.2、我们把保存的上一个节点的地址更新为当前节点;即它前面的节点都已经翻转完毕

    2.3、我们更新当前节点为下一个节点的地址,我们在前面保存了

    3、当我们遍历完所有节点时,我们只需要把我们的上一个节点的地址返回即可

    好了,我们跟着思路实现一下

    翻转函数

    /**
         * 思路:
         *  1、我们需要定义两个临时ListNode,一个保存当前节点下一个节点的地址,一个保存当前节点上一个节点的地址
         *  2、在一次循环中,我们需要保存当前节点的下一个节点的地址
         *  2.1、我们需要更新当前节点的next指向,即指向我们保存的当前节点上一个节点的地址
         *  2.2、我们把保存的上一个节点的地址更新为当前节点;即它前面的节点都已经翻转完毕
         *  2.3、我们更新当前节点为下一个节点的地址,我们在前面保存了
         *  3、当我们遍历完所有节点时,我们只需要把我们的上一个节点的地址返回即可
         * @param head
         * @return
         */
        public static ListNode reverse(ListNode head) {
            
            if(head == null || head.next == null) {
                //链表为空或者只有一个节点的直接返回
                return head;
            }
            
            ListNode preNode , nextNode;
            preNode = nextNode = null;
            
            while(head != null) {
                nextNode = head.next;//保存当前节点的下一个节点
                head.next = preNode;//翻转当前节点的指向
                preNode = head;//更新上一个节点
                head = nextNode;//更新当前节点
            }
            
            return preNode;
        }
    
    

    ListNode类

    class ListNode{
        int val;
        ListNode next;
        public ListNode(int val) {
            this.val = val;
            this.next = null;
        }
        
        public static void showListNode(ListNode listNode) {
            while(true) {
                if(listNode.next == null ) {
                    System.out.print(listNode.val);
                    break;
                }else {
                    System.out.print(listNode.val+"-->");
                }
                
                listNode = listNode.next;
            }
            
        }
    }
    
    

    测试函数

    public static void main(String[] args) {
            ListNode listNode = new ListNode(0);
            for(int i = 1 ; i < 10 ; i++) {
                ListNode temp = new ListNode(i);
                temp.next = listNode;
                listNode = temp;
            }
            
            ListNode.showListNode(listNode);
            
            System.out.println();
            
            listNode = reverse(listNode);
            
            ListNode.showListNode(listNode);
        }
    
    

    相关文章

      网友评论

      • helloKimmy:链表属于基础数据结构,一般情况下,在支持类的语言中都有预定义的可用。链表有单向链表和双向链表两种,需要逆向访问的可以使用双向链表。一般讲,单向链表节省内存,双向链表数据可靠性与可修复性要好很多。编译通不过的话,可能与指针操作或者内存操作有关。:smile::smile::smile:
        helloKimmy:@奇迹迪 不客气。:smile::smile::smile:
        奇迹迪:@helloKimmy 谢谢,学习了

      本文标题:翻转链表

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