LeetCode反转链表的方式有哪些
1. 迭代法
迭代法是一种常见且简洁的解法。具体操作如下:
1)定义三个指针:pre指向前一个节点,cur指向当前节点,next指向下一个节点。
2)在迭代过程中,改变节点之间的指向关系,使当前节点指向前一个节点。
3)根据条件判断是否继续迭代,直至链表尾节点为null。
// 迭代法
public ListNode reverseList(ListNode head) {
ListNode pre = null;
ListNode cur = head;
while (cur != null) {
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}
2. 递归法
递归法是将问题拆解成子问题来解决,解决子问题后再逐步返回结果。
具体步骤如下:
1)递归到链表的末尾节点,将其作为新的头节点返回。
2)递归返回时,将当前节点的下一个节点指向当前节点。
3)通过递归的方式不断改变指向关系,完成链表的反转。
// 递归法
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode p = reverseList(head.next);
head.next.next = head;
head.next = null;
return p;
}
3. 头插法
头插法是一种常用的反转链表的方法,也是迭代法的一种变形。
具体步骤如下:
1)定义一个新的空节点dummy,作为新链表的头节点。
2)迭代遍历原链表的所有节点,将每个节点插入到dummy节点之后,从而实现链表反转。
3)返回dummy节点的下一个节点,即为反转后的链表头节点。
// 头插法
public ListNode reverseList(ListNode head) {
ListNode dummy = new ListNode(-1);
while (head != null) {
ListNode temp = head.next;
head.next = dummy.next;
dummy.next = head;
head = temp;
}
return dummy.next;
}
以上是三种常用的反转链表的方法,迭代法、递归法和头插法。每种方法各有特点,可以根据实际情况选择适合的方法来解决问题。
本文由轻山版权所有,禁止未经同意的情况下转发
上一篇
怎么为CDSW的数据目录扩容 猜您想看
-
IRscope代码中ui相关的代码是这样的
UI相关代码概...
2023年07月23日 -
怎样解决苹果手机无法使用手势解锁的问题?
苹果手机无法使...
2023年04月27日 -
C++怎么解决汽水瓶问题
一、汽水瓶问题...
2023年05月22日 -
宝塔使用技巧:如何启用 Gzip 压缩 JS/CSS 文件
SEO软...
2023年05月07日 -
如何使用Edge浏览器中的“收藏夹”功能
如何使用Edg...
2023年05月13日 -
如何理解服务器单I/O线程+工作者线程池模型架构及实现要点
一、服务器单I...
2023年05月26日