程序员

剑指offer----反转链表

2018-02-03  本文已影响0人  qming_c

题目:输入一个链表,反转链表后,输出链表的所有元素。

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/

方法一 递归

public class Solution {
    ListNode node = null;
    public ListNode ReverseList(ListNode head) {
        if(head == null ||head.next == null){
            return head;
        }
        node = ReverseList(head.next);
    head.next.next = head;
        head.next = null;
        return node;
    }
}

一般情况下反转的问题利用递归代码写起来是比较简洁的,但是也用调用栈过深导致溢出的缺点,并且对递归函数调用前后的的代码块的特点也有要一定的理解。

本题中,最终要返回反转之后的头结点,所以

方法二

public class Solution {
    ListNode node;
    public ListNode ReverseList(ListNode head) {
        ListNode first = null;
        ListNode second = null;
        while(head != null){
            first = head.next;
            head.next = second;
            second = head;
            head = first;
        }
        return second;
    }
}

上面使用递归的解释中提到,正向反转的话会出现链表断裂的情况,找不到下一个节点,那么我们可以使用一个指针一直指向下一个节点,然后将这个指针的next指向上一个节点即可。

上一篇下一篇

猜你喜欢

热点阅读