leetcode206反转链表

在这里插入图片描述题目描述非常简单,实现起来也比较容易,但是第一次看的时候有点被吓到了,而且有些地方没想明白,所以做一下记录。

迭代

迭代的想法是比较简单的,由于ListNode中不含对前面节点的引用,所以为了让链表的方向反转过来,我们需要引入一个指针来指向前面的节点,分别将这两个节点记为prev和curr,那么当前的状态可以这么表示:prev=>curr=>curr.next,在这一步 我们想做的是将curr.next设置为prev,可以直接更改,但是这样又带来一个问题,将curr节点中的next属性更改后,我们便无法访问到原来curr的next节点,程序便无法继续运行。所以,在更改curr.next指向之前,我们需要将它所指向的节点保存下来,继续迭代。

class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode prev = null;
        ListNode curr = head;
        while(curr != null) {
            ListNode temp = curr.next;
            curr.next = prev;
            prev = curr;
            curr = temp;
        }
        return prev;
    }
}

只进行一次遍历,时间复杂度为O(n),空间复杂度为O(1)

递归的写法

递归方法实现反转的顺序应该是从链表尾部进行反转的,假设原链表为
1=>2=>3=>4=>5=>null
经过几步递归之后,链表变成了
1=>2=>3=>4<=5
我们最终想要的结果,也就是反转后链表的头newNode就是5,在现在这个时刻,我们要做的是将4指向3,如果当前head指向3的话,这一步的描述为head.next.next = head ,

class Solution {
    public ListNode reverseList(ListNode head) {
    	// 如果该节点之后没有新的节点,那么它就是反转后链表的新头
        if(head == null || head.next == null) return head;
        // 从head节点开始,将head之后的节点反转
        // 1=>2=>3=>4=>5=>null eg:head.val = 3 ,反转之后为1=>2=>3=>4<=5
        ListNode newhead = reverseList(head.next);
        // 将head正确的接入到反转后的链表中1=>2=>3<=4<=5
        head.next.next = head;
        // 上述操作只是将head.next这个节点的next指向了head,但是head仍然指向着head.next,
        // 为了避免形成环路,将他置为null,同时可以使得null<=1<=2<=3<=4<=5
        head.next = null;
        //返回
        return newhead;
    }
}

只进行一次遍历,时间复杂度为O(n),空间复杂度为O(n)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值