当前位置:网站首页 > 区块链基础 > 正文

单向链表逆序(如何实现一个高效的单向链表逆序输出)

思路分析

需要考虑以下因素

数据量是否会很大。

空间是否有限制。

原始链表的结构是否可以更改。

时间复杂度是否有限制。

一个链表节点需要输出的元素有多个,例如链表中存的是自定义对象,有多个字段。

方法一、直接递归(简单,但O(n)空间复杂度不支持大数据量)

// 直接递归实现核心代码片段public void reverse(head){ // 递归终止条件 if(head.next == null){ print(head); return; } // 下一层需要做的事儿 reverse(head.next); // 本层需要做的事儿  print(head);

方法二、采用栈进行存储(O(n)时间复杂度,但不支持大数据量,栈中需要存储所有节点)

// 采用栈进行存储实现核心代码片段public void reverse(head){ Node cur = head; // 将所有元素入栈 while(cur != null){ stack.push(cur); cur = cur.next; } // 将所有元素出栈 while(!stack.isEmpty){ print(stack.poll); }}

方法三、直接遍历(不需要额外存储空间,但O(n^2)时间复杂度)

// 直接遍历实现核心代码public void reverse(head){ Node cur = head; int count = 0; // 统计链表节点个数 while(cur != null){ count ++; cur = cur.next; } // 每次从前往后进行扫描输出 for(int i = count; i > 0; i--){ int tmp = i; cur = head; while(tmp-- != 0){ cur = cur.next; } print(cur) }}

方法四、翻转链表再遍历(O(n)时间复杂度且不需要额外存储空间,但需要改变原始链表结构)

// 翻转链表实现核心代码public void reverse(head){ Node cur = head.next; Node pre = head; pre.next = null; Node tmp = new Node(); // 翻转链表 while(cur != null){ tmp = cur.next; cur.next = pre; pre = cur; cur = tmp; } // 输出 while(pre != null){ print(pre); pre = pre.next; } }

方法五、头插法新建空链表(简单,但是O(n)空间复杂度)

// 头插法新建空链表实现核心代码public void reverse(head){ Node result = copy(head); Node cur = head; cur = cur.next; // 新建链表节点,头插法构建 while(cur != null){ Node tmp = copy(cur.next); tmp.next = pre; pre = tmp; cur = cur.next; }}

下面给一个完成的代码写法,供各位参考

class Solution {

public void reverse(ListNode head) { if (head == null || head.next == null) { return ; } ListNode currentNode = head; Stack > stack = new Stack<>(); while (currentNode != null) { stack.push(currentNode); ListNode tempNode = currentNode.next; currentNode.next = null; // 断开连接 currentNode = tempNode; } head = stack.pop(); currentNode = head; while (!stack.isEmpty()) { currentNode.next = stack.pop(); currentNode = currentNode.next; } }}

class ListNode { T val; public ListNode(T val) { this.val = val; } ListNode next;}

到此这篇单向链表逆序(如何实现一个高效的单向链表逆序输出)的文章就介绍到这了,更多相关内容请继续浏览下面的相关 推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 双向链表比单向链表的优点(双向链表比单向链表的优点和缺点)2026-05-07 18:18:07
  • 快手跳转链接怎么弄(快手的链接怎么弄)2026-05-07 18:18:07
  • b站视频如何加跳转链接(b站视频如何添加链接)2026-05-07 18:18:07
  • 单链表实现排序(给单链表排序)2026-05-07 18:18:07
  • 二维码跳转链接制作(二维码跳转网页制作)2026-05-07 18:18:07
  • 单链表 逆序(单链表逆序代码)2026-05-07 18:18:07
  • 怎么点击图片跳转链接文件(如何点击图片跳转链接)2026-05-07 18:18:07
  • 怎么点击图片跳转链接(点击图片跳转另一个图片)2026-05-07 18:18:07
  • 单向链表的存储密度是?(单链表的存储密度高于双链表)2026-05-07 18:18:07
  • 游戏代码网站链接(游戏代码网站链接怎么打开)2026-05-07 18:18:07
  • 全屏图片