考察知识点:
题目考察链表操作的知识点
题目思路分析:
对于反转链表,有以下的情况:
- 空链表,或者只有头节点的情况 {Null} {1->Null}
- 头节点后面只有一个节点的情况 {1->2->Null}
- 头节点后面有多个节点的情况 {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; } }