反转链表

 

Posted by     DH on August 10, 2017

题目

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

分析

首先这个题要看清楚,是反转链表再进行输出,而不是将链表反向输出。所以第一件要做的就是将链表反转。

假如首先我们只考虑两个节点的反转,只需要将head.next指向之前的节点就行了。但是假如有三个节点,加入第二个是当前的head的节点,我们将head.next指向之前 的节点,前两个节点的顺序交换了,但是第三个节点和第二个节点就断了。所以,还要一个节点记录head的后一个节点,防止链表断裂。

因此,head为当前节点,pre为head的前一个节点,next为head的后一个节点。具体的过程如下:

先用next保存head.next。防止链表断裂,无法继续下面的操作。

下面进行第二步,将当前节点的next指向上一个节点,也就是pre。

接下来,将head节点指向next,也就是第三个指针next的作用,pre指向head。

至此,可以看到我的第一个图有一点错误,head和pre之间是没有连接的,再次仅仅是为了开始的时候好理解。

代码

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

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode ReverseList(ListNode head) {
      if(head == null)
          return null;

        ListNode pre = null;
        ListNode next = null;

        while( head != null){
            next = head.next;
            head.next = pre;
            pre = head;
            head = next;
        }
        return pre;
    }
}