算法通关村第二关——链表反转

链表反转,就是链表原来是1->2->3->4->5,经过反转处理过后变成5->4->3->2->1

处理链表反转,有两种方式,一个是建立虚拟头结点,一个是直接操作链表反转。

1. 建立虚拟头结点

算法通关村第二关——链表反转_第1张图片

 这是执行的流程

最核心的两行就是

cur.next = ans.next;
ans.next = cur;

直接想我要让她反转,我现在设立了虚拟头结点,那我就要让新加进这个反转链表的结点的next为我反转链表中ans的next,再让ans的next设为当前结点,也就是我刚才处理的结点。

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

这里我对于代码的理解是刚开始设立了ans,但是还没有将ans.next设为第一个结点1,是在第一次循环的时候做的,cur刚开始是原链表的1,循环中,

将cur.next也就是2先设立为next,让ans.next(null)给到cur.next,这里做的是让原链表头结点1的next为null,因为在反转之后,1作为链表的尾结点,next为null。

然后让cur(1)给到ans.next,就是让ans和1建立起了关联。

然后让next也就是原链表的头结点1的下一个结点,给到cur,在处理下一个结点。这样就实现了链表反转。

2. 直接在链表操作

这种也是要会的

算法通关村第二关——链表反转_第2张图片

 

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

你可能感兴趣的:(算法,链表,javascript)