反转链表的三种写法

题目链接:https://leetcode.cn/problems/reverse-linked-list/

反转链表的三种写法_第1张图片

方法一:循环,维护好两个节点一个前一个后

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

方法二:递归

比较难想,首先我们直接递归找到最后的头节点,这个头结点不能再动了,直接有一个.next.next就是找下一个节点,把下一个节点的下一个指向当前节点,然后当前节点下一个指空,这样子回到上一个递归的时候就可以保持头节点不变,只变化了中间的节点关系,就算head指向了空也没事,递归回去栈中还保存着head的信息不会丢失。

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; 
    }
}

方法三:头插法(最好想的一种办法,推荐)

循序很重要,头插法首先先记录下来头节点下一个的点存起来,然后头节点指向当前节点,然后头结点的下一个下一个指向存起来的点,head继续指向下一个,head的next不能动。这里我们需要知道一个点:p.next = head,head = head.next , p.next 不会指向head.next就像变量赋值一样的道理。

class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode p = new ListNode(0);
        while(head!=null){
            ListNode temp = p.next;
            p.next = head;
            head = head.next;
            p.next.next = temp;
        }
        return p.next;
    }
}

你可能感兴趣的:(算法,链表,数据结构)