算法通关村第二关——终于学会链表反转了

算法通关村第二关——终于学会链表反转了

题目:LeetCode206,链表反转

思路:链表反转有两种思路

  1. 创建一个虚拟头结点,并在虚拟头结点直接逐个插入链表节点

  2. 直接在链表上操作,用双指针,分别操作。

  3. (额外)利用递归进行链表反转

解法:

  1. 头插法

        /**
         * 链表反转有两种方法
         * 1.创造虚拟节点,然后把节点一个一个从中间插入
         * 2.不创建虚拟节点,直接操作链表实现反转
         * @param head
         * @return
         */
        public ListNode reverseList(ListNode head) {
            //1.用虚拟节点实现反转
            ListNode ansHead = new ListNode(-1);
            ListNode cur = head;
            while (cur!=null){
                ListNode nextNode = cur.next;
                cur.next = ansHead.next;
                ansHead.next = cur;
                cur = nextNode;
            }
            return ansHead.next;
        }
    
  2. 穿针引线法

        /**
         * 方法2,不创建虚拟节点,直接操作链表实现反转
         * @param head
         * @return
         */
        public ListNode reverseList2(ListNode head) {
            //1.直接操作链表
            ListNode cur = head;
            ListNode prev = null;
            while (cur!=null){
                ListNode next = cur.next;
                cur.next = prev;
                prev = cur;
                cur  = next;
            }
            return prev;
            
        }
    
  3. 递归

    class Solution {
        public ListNode reverseList(ListNode head) {
            if (head == null || head.next == null) {
                return head;
            }
            ListNode newHead = reverseList(head.next);
            head.next.next = head;
            head.next = null;
            return newHead;
        }
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值