1.题目描述:
给定一个单链表的头结点pHead,长度为n,反转该链表后,返回新链表的表头。
数据范围: n\leq1000n≤1000
要求:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n) 。
如当输入链表{1,2,3}时,
经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
2.解题:
使用栈,因为栈是先进后出的。实现原理就是把链表节点一个个入栈,当全部入栈完之后再一个个出栈,出栈的时候在把出栈的结点串成一个新的链表。原理如下:
3.代码实现
import java.util.Stack;
/**
* @ClassName reverse
* @Description TODO
* @Author NZS
* @Date 2021-10-31 21:28
* @Version 1.0
*/
class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
public class reverse {
public static ListNode ReverseList(ListNode head) {
Stack<ListNode> stack = new Stack<>();
while (head!=null){
stack.push(head);
head = head.next;
}
if (stack.isEmpty()){
return null;
}
ListNode node = stack.pop();
ListNode dummy = node;
//栈中的结点全部出栈,然后重新连成一个新的链表
while (!stack.isEmpty()) {
ListNode tempNode = stack.pop();
node.next = tempNode;
node = node.next;
}
//最后一个结点就是反转前的头结点,一定要让他的next
//等于空,否则会构成环
node.next = null;
return dummy;
}
public static void main(String[] args) {
ListNode list1 = new ListNode(1);
ListNode list2 = new ListNode(2);
ListNode list3 = new ListNode(3);
list1.next=list2;
list2.next=list3;
list3.next=null;
ListNode resu = ReverseList(list1);
while (resu!=null){
System.out.println(resu.val);
resu = resu.next;
}
}
}