考察知识点:

题目考察链表操作的知识点

题目思路分析:

对于反转链表,有以下的情况:

  1. 空链表,或者只有头节点的情况 {Null} {1->Null}
  2. 头节点后面只有一个节点的情况 {1->2->Null}
  3. 头节点后面有多个节点的情况 {1->2->3-...->8->Null}

使用pre变量初始化指向头节点,node变量指向首元节点

对于第一种情况直接将链表返回即可,不用改变。对应代码23行

对于头节点后面只有一个节点的情况,及首元节点后面就是Null的时候,需要做的是将头节点和首元节点进行反转,此时25行判断后会跳过循环直接进入31-33行,反转首元节点和头节点并将头节点尾部赋予Null指针,然后返回。

对于第三种情况,需要的是不断循环以下步骤

  • 将当前节点的next指向前一个节点
  • 将当前节点(node)的前一个节点(pre)更新,pre指向node
  • 更新当前节点(node),让其指向他的下一个节点(tail)

循环这个过程,直到当前节点node已经到达尾部(node.next==null成立的时候)

此时手动更新node指向前一个节点pre即可

并且将头节点的next指针进行更新即可完成整个链表的反转。

语言选择:

Java

完整代码:

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
        if(head==null||head.next==null) return head;  //特殊情况直接返回
        ListNode pre = head, node = head.next; //用于指定当前节点的前面节点和当前节点
        while(node.next!=null){
            ListNode tail = node.next; //当前节点的后一个节点
            node.next = pre;
            pre = node;
            node = tail;
        }
        node.next = pre;
        head.next = null;
        return node;
    }
}