题目
输入一个链表,反转链表后,输出新链表的表头。
1.思路
思路1
遍历链表,将链表的结点逐个摘下,用尾插法拼接到新的空链表尾部。
思路2
遍历两次链表:
第一次遍历链表,找到链表的最后一个结点lastnode;
第二次遍历链表,把链表的结点逐个用头插法拼接到lastnode之后。
2.代码(Java实现)
解题代码在第三部分,三部分组成完整的代码。
public class Main {
public static void main(String[] args) {
ListNode head = new ListNode(0);
ListNode tail = head;
// 尾插法创建一个简单的链表
for (int i = 1; i < 5; i++) {
ListNode p = new ListNode(i);
tail.next = p;
tail = tail.next;
}
ListNode check = head;
while(check != null) {
System.out.print(check.val + " ");
check = check.next;
}
Solution solution = new Solution();
// 输出检查链表是否逆置
ListNode checks = solution.ReverseList(head);
while(checks != null) {
System.out.print(checks.val + " ");
checks = checks.next;
}
}
}
class ListNode{
// 链表结点数据结构
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
// 方法 1:借助新的空链表,尾插法逆置
class Solution {
public ListNode ReverseList(ListNode head) {
// 创建空链表
ListNode old = head;
ListNode temp = null;
ListNode flag = null;
// 尾插法创建链表
while(old != null) {
temp = old;
old = old.next;
temp.next = flag;
flag = temp;
}
return flag;*/
if (head == null) {
return null;
}
ListNode result = head;
while(result.next != null) {
result = result.next;
}
ListNode index = head;
ListNode item = null;
// 头插法创建链表
while(index != result) {
item = index;
index = index.next;
item.next = result.next;
result.next = item;
}
return result;
}
}
// 方法 2:头插法,只靠原链表完成逆置
class Solution {
public ListNode ReverseList(ListNode head) {
if (head == null) { // 判断链表是否为空
return null;
}
ListNode result = head;
// 遍历找到链表的最后一个结点
while(result.next != null) {
result = result.next;
}
ListNode index = head;
ListNode item = null;
// 头插法逆置链表
while(index != result) {
item = index;
index = index.next;
item.next = result.next;
result.next = item;
}
return result;
}
}
本文作者:
whtli
本文链接: https://hexo.whtli.cn/archives/ec1cf20c.html
版权声明: 遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
本文链接: https://hexo.whtli.cn/archives/ec1cf20c.html
版权声明: 遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。