网站链接:牛客网-题库-在线编程-剑指offer
import java.util.*;
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode ReverseList(ListNode head) {
}
}
- ReverseList方法返回的是新链表的头节点
解题思路一(后插方式创建新链表)
可以在遍历原始链表的时候,将原始链表的数值存放在栈中,在创建新链表的时候,再从栈中依次取出数值
注意点
在创建新链表的时候:
- 需要一个变量(代码中使用的是head)一直指向头节点,作为最后的返回值
- 需要一个变量一直指向正在创建的节点(代码中使用的是node)
- 需要一个变量一直指向正在创建的节点的前一个节点(代码中使用的是pre),这样才能将链表“连”起来
代码
import java.util.*;
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode ReverseList(ListNode head) {
ListNode tmp = head;
Stack<Integer> stack = new Stack<>();
while (tmp != null) {
stack.push(tmp.val);
tmp = tmp.next;
}
ListNode pre = null;
head = null;
while (!stack.empty()){
ListNode node = new ListNode(stack.pop());
node.next = null;
//判断是不是创建的第一个节点
if (pre == null){
//是,则head指向该节点,pre指向该节点
pre = node;
head = node;
}else {
//不是,则pre的next指向当前新创建的节点
pre.next = node;
//再移动pre,让pre指向当前节点,保证链表的顺利连接
pre = node;
}
}
return head;
}
}
解题思路二(前插方式创建新链表)
前插:将每一个新创建的节点放在链表的开头,即链表的head是不断变化的,思路一的后插则是第一个节点一旦创建,head就不变
使用前插,则不必使用栈或者其他结构来临时储存数据,可以直接在遍历原始链表的时候创建新的链表
代码
import java.util.*;
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode ReverseList(ListNode head) {
//tmp 遍历原始链表
ListNode tmp = head;
//新链表的头节点
head = null;
while (tmp != null) {
//创建一个新的节点
ListNode node = new ListNode(tmp.val);
//判断是不是第一个创建的节点
if (head == null) {
node.next = null;
} else {
node.next = head;
}
head = node;
tmp = tmp.next;
}
return head;
}
}