算法通关村第二关-青铜终于学会链表了

大家好我是苏麟 , 今天来学反转链表 . 

反转链表

描述 :

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

LeetCode 206.反转链表 : 

206. 反转链表

算法通关村第二关-青铜终于学会链表了_第1张图片

算法通关村第二关-青铜终于学会链表了_第2张图片

牛客 BM1 反转链表 :

算法通关村第二关-青铜终于学会链表了_第3张图片

算法通关村第二关-青铜终于学会链表了_第4张图片

 分析

本题有两种方法,带头结点和不带头结点,我们都应该会,因为这两种方式都很重要,如果搞清楚,很多链表的算法题就不用做了。

当然也可以用栈 , 这样也很简单 . 

建立虚拟头结点辅助反转

前面分析链表插入元素的时候,会发现如何处理头结点是个比较麻烦的问题,为此可以先建立一个虚拟的结点ans,并且令ans.next=head,这样可以很好的简化我们的操作。如下图所示,如果我们将链表(1->2>3->4->5进行反转,我们首先建立虚拟结点ans,并令ans.next=node(1),接下来我们每次从旧的链表拆下来一个结点接到ans后面,然后将其他线调整好就可以了。

算法通关村第二关-青铜终于学会链表了_第5张图片

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    public ListNode ReverseList (ListNode head) {
        // write code here
        ListNode node = new ListNode(0);
        ListNode p = head;
        while(p != null){
            ListNode s = head.next;
            s.val = p.val;
            node.next = s;
            p = p.next;
        }
        return node;
    }
}

建立虚拟结点是处理链表的经典方法之一,虚拟结点在很多工具的源码里都有使用,用来处理链表反转也比较好理解,因此我们必须掌握好。

这期就到这里 , 下期见!

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