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) {
// 记录前驱节点、当前节点
ListNode prev = null;
ListNode curr = head;
// 循环条件当前节点不为null
while (curr != null) {
// 记录后继结点
ListNode next = curr.next;
// 记录完后继结点后,才把前驱节点的下一步赋值为prev,类似尾插法,先把第一个结点的next指向null,然后再把第二个结点的next指向第一个结点,以此类推
curr.next = prev;
// 前驱结点向后走一步
prev = curr;
// 当前节点向后走一步
curr = next;
}
// 返回前驱结点,因为跳出循环的条件是curr==null,那么prev就是最后一个有值的节点,返回即可
return prev;
}
/**
解法二: 栈或者哈希
*/
public ListNode ReverseList(ListNode head) {
// 创建栈存结点
Stack<ListNode> stack = new Stack<>();
// 遍历链表,并存到栈中
while(head!=null){
stack.push(head);
head=head.next;
}
// 如果栈为空,直接返回null
if(stack.isEmpty()){
return null;
}
// 根据栈的先入后出的特性,开始出栈
ListNode lastNode = stack.pop();
// 赋值给一个新的头结点,并最终要返回这个新的头结点
ListNode newHead = lastNode;
// 循环条件:栈不为空 一边遍历一边出栈,将结点相连
while(!stack.isEmpty()){
ListNode temp = stack.pop();
lastNode.next = temp;
lastNode = lastNode.next;
}
//最后一个结点pop后,next赋值为null,防止形成环
lastNode.next=null;
return newHead;
}
}
本题考察知识点:
1.链表的遍历
2.前驱结点和后继结点的相连
本题解题思路:
方法一:模拟
1.记录前驱节点、当前节点
2.循环条件当前节点不为null
3.记录后继结点
4.记录完后继结点后,才把前驱节点的下一步赋值为prev,类似尾插法,先把第一个结点的next指向null,然后再把第二个结点的next指向第一个结点,以此类推
5.前驱结点向后走一步
6.当前节点向后走一步
7.返回前驱结点,因为跳出循环的条件是curr==null,那么prev就是最后一个有值的节点,返回即可
方法二:栈
直接看注释就可以了非常完善捏
如果您觉得本题对您有帮助的话,可以点个赞支持一下,感谢~

京公网安备 11010502036488号