反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list
思路:空间换时间。遍历链表,将其入栈,按出栈顺序构建新的链表返回即可,因为栈是先进后出的数据结构,所以可以实现逆序。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
ListNode resListNode = new ListNode(0) ;
ListNode pListNode = head;
ListNode res = resListNode;
Stack<Integer> st = new Stack<Integer>();
while(pListNode!=null) {
st.push(pListNode.val);
pListNode = pListNode.next;
}
while(!st.empty()) {
res.next = new ListNode(st.peek());
st.pop();
res = res.next;
}
return resListNode.next;
}
}
测试代码:
package com.leetcode;
import java.util.Stack;
/**
** @author wanglj
** @time 2020-9-14 21:47:19
** @filecomment
** @fileName Solution.java
** @packageName com.leetcode
** @Todo TODO
**/
class ListNode {
int val;
ListNode next;
ListNode(int x) {val = x;}
}
public class Solution {
public ListNode reverseList(ListNode head) {
ListNode resListNode = new ListNode(0) ;
ListNode pListNode = head;
ListNode res = resListNode;
Stack<Integer> st = new Stack<Integer>();
while(pListNode!=null) {
st.push(pListNode.val);
pListNode = pListNode.next;
}
while(!st.empty()) {
res.next = new ListNode(st.peek());
st.pop();
res = res.next;
}
return resListNode.next;
}
public static void main(String[] args) {
ListNode headListNode = new ListNode(1);
ListNode pListNode = headListNode;
int cnt = 4;
int data = 2;
while(cnt!=0) {
pListNode.next = new ListNode(data);
data++;
pListNode = pListNode.next;
cnt--;
}
Solution solution = new Solution();
ListNode resListNode = solution.reverseList(headListNode);
while(resListNode!=null) {
System.out.println(resListNode.val);
resListNode = resListNode.next;
}
}
}