leedCode刷题笔记——反转链表(easy)

反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

这个题目考研的时候还复习过,然而忘记了…(我还能记得啥???)
参考:https://cloud.tencent.com/developer/article/1450113
1.通过循环,通过三个指针对链表进行遍历并逐个反转(一开始我想到的)
我自己写的时候第一个总是处理不好,因为第一个的next指针修改后要指向空,还是学习的CN大神的解法
代码:

public ListNode reverseList(ListNode head) {
         ListNode newHead=new ListNode(-1);
        while (head!=null){
            ListNode next=head.next;
            head.next=newHead.next;
            newHead.next=head;
            head=next;
        }
        return newHead.next;
    }

leedCode刷题笔记——反转链表(easy)_第1张图片(没看出来内存少多少啊…)
2.使用递归的方法进行反转

从倒数第二个节点开始反转,依次向前,将后一个节点的next指向当前结点。注意每次反转后要将当前节点的next置空,表示断开当前结点与后一个节点的关联。时间复杂度和空间复杂度都是O(n)。每次递归都需要为实参分配空间,所以相较于非递归实现,较为耗费栈空间,且不易理解
代码:

public static ListNode reverse(ListNode head){
        //递归终止条件:找到链表最后一个结点
        if (head==null||head.next==null){
            return head;
        }
        ListNode newhead=reverse(head.next);//先递后归,从后往前遍历每个节点进行反转
        head.next.next=head;
        head.next=null;
        return newhead;

    }

leedCode刷题笔记——反转链表(easy)_第2张图片

你可能感兴趣的:(leetcode)