19. 单链表反转
时间限制:10.000S 空间限制:128MB
题目描述
根据一个整数序列构造一个单链表,然后将其反转。
例如:原单链表为 2 3 4 5 ,反转之后为5 4 3 2
输入描述
输入包括多组测试数据,每组测试数据占一行,第一个为大于等于0的整数n,表示该单链表的长度,后面跟着n个整数,表示链表的每一个元素。整数之间用空格隔开
输出描述
针对每组测试数据,输出包括两行,分别是反转前和反转后的链表元素,用空格隔开
如果链表为空,则只输出一行,list is empty
输入示例
5 1 2 3 4 5
0
输出示例
1 2 3 4 5
5 4 3 2 1
list is empty
提示信息
本题用数组,也是可有过的,输入一遍数组,然后倒叙输出。不过建议大家用本题来链表操作
解法一(模拟)
思路分析:
- 自建链表进行操作
- 按照题目意思进行列表反转, 可以循环链表,将前面的节点依次插入到原本的最后一个节点之后实现翻转
实现代码如下:
java
public class k_19_SinglyLinkedListReversal {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n; // 列表长度
while (in.hasNext()) {
n = in.nextInt();
LinkedList first = new LinkedList();
LinkedList end = first;
// first.next = end;
while (n-- > 0) {
int val = in.nextInt();
end.next = new LinkedList(val);
end = end.next;
}
if (first.next != null) {
// 输出正序
for (LinkedList p = first.next; p != end.next; p = p.next) {
System.out.print(p.val + " ");
}
System.out.println();
// 反转
LinkedList q = first.next;
while (q != end) {
// 取出节点
LinkedList temp = q;
q = q.next;
temp.next = null;
// 插入end之后
temp.next = end.next;
end.next = temp;
}
// 输出反转
for (LinkedList i = end; i != null; i = i.next) {
System.out.print(i.val + " ");
}
System.out.println();
} else {
System.out.println("list is empty");
}
}
}
private static class LinkedList {
int val;
LinkedList next;
public LinkedList() {
this.next = null;
}
public LinkedList(int val) {
this.val = val;
this.next = null;
}
public LinkedList(int val, LinkedList next) {
this.val = val;
this.next = next;
}
}
}
运行结果如下:
运行时间: 2427ms 消耗内存: 59716kb
复杂度分析:
- 时间复杂度:
- 空间复杂度: