1.题目
输入一个链表,反转链表后,输出新链表的表头。
2.思路
栈。先入栈,第一个出栈的节点记录下来,然后依次出栈,期间调整指针。
反转指针。预先记录next节点,然后反转head和pre之间的指针,让head指向pre,然后再将pre和head右移,最后将pre返回,此时pre在最后,head为pre后面一个节点,为null。
3.代码
栈
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
import java.util.Stack;
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head==null){
return null;
}
Stack<ListNode> stack1 =new Stack<ListNode> ();
while(head!=null){
stack1.push(head);
head=head.next;
}
ListNode fir=stack1.pop();//先把头结点取出来,用于返回
ListNode ln=fir; //这个是头结点对应的链表
while(!stack1.isEmpty()){
ln.next=stack1.pop();
ln=ln.next;
}
ln.next=null;//这句不加会报错。
return fir;
}
}
指针反转
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
import java.util.Stack;
public class Solution {
public ListNode ReverseList(ListNode head) {
ListNode next=null;
ListNode pre=null;
while(head!=null){
next=head.next; //先预先记录next节点
head.next=pre;//指针反转
pre=head; //pre右移
head=next;//head右移
}
return pre;//注意返回的是pre,head是pre的下一个结点,是空的。
}
}