1、题目描述
输入一个链表,反转链表后,输出新链表的表头。
2、思路分析及代码实现
方法一:利用栈的特性
1、保存链表中的数据到栈
2、修改链表中结点的值为栈中的数据
3、返回新结点
import java.util.Stack;
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head==null||head.next==null){
return head;
}
ListNode curNode=head;
Stack<Integer> stack=new Stack<>();
while(curNode!=null){
stack.push(curNode.val);
curNode=curNode.next;
}
ListNode newHead=head;
newHead.val=stack.pop();
while(!stack.isEmpty()){
head=head.next;
head.val=stack.pop();
}
return newHead;
}
}
方法二:直接操作结点
1、新建三个结点分别代表当前结点cur、前一个结点pre和后一个节点next;
2、若当前节点不为空,记录当前节点的下一个结点为next,让当前节点的下一个结点指向前驱接结点,完成反转。之后pre为当前节点,当前接结点后移;
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head==null||head.next==null){
return head;
}
ListNode pre = null; // 当前节点的前一个节点
ListNode cur=head;
ListNode next = null; // 当前节点的下一个节点
while( cur != null){
next = cur.next; // 记录当前节点的下一个节点位置;
cur.next = pre; // 让当前节点指向前一个节点位置,完成反转
pre = cur; // pre 往右走
cur = next;// 当前节点往右继续走
}
return pre;
}
}
方法三:递归法
1、若当前节点为空或当前结点的下一个结点为空,返回当前节点;
2、否则对以当前节点的下一个结点为头结点的链表进行反转操作。
3、再将当前节点设置为后面节点的后续节点
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head==null||head.next==null){
return head;
}
ListNode newHead=ReverseList(head.next);
head.next.next=head;
head.next=null;
return newHead;
}
}