Reverse Linked List(反转链表)

这篇博客详细介绍了如何反转单链表,包括迭代和递归两种方法。在迭代中,通过维护一个指向前一节点的指针pre,逐步更新节点的next指针,直到遍历完链表。而在递归实现中,利用递归调用来反转链表的部分或全部节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述:

Reverse a singly linked list.
A linked list can be reversed either iteratively or recursively. Could you implement both?

分析:

  • 首先定义一个指向当前节点前一节点的指针pre,初值为null,只要当前节点不为空就循环执行下面四步操作,否则直接跳出循环,返回pre指针(因为跳出循环就意味着当前节点为空,那新的头节点就是当前节点的前一节点)

    1. 备份当前节点的next指针
    2. 将当前节点的next指针指向前一节点,即赋值为pre
    3. 将当前节点变成前一节点,即pre=当前节点
    4. 将下一节点变成当前节点,即当前节点=下一节点

代码:

//定义链表节点
public class ListNode{
  int val;
  ListNode next;
  ListNode(int x) {val = x};
}
  • 迭代方法:
public ListNode reverseList(ListNode head) {
    ListNode pre = null;//定义一个指向当前节点前一节点的指针pre,初值为null
    while(head != null) {
      ListNode next = head.next;//备份当前节点的next指针
      head.next = pre;//将当前节点的next指针指向前一节点,即赋值为pre
      pre = head;//将当前节点变成前一节点,即pre=当前节点
      head = next;//将下一节点变成当前节点,即当前节点=下一节点
    }
    return pre;//返回pre指针(因为跳出循环就意味着当前节点为空,那新的头节点就是当前节点的前一节点)
}
  • 递归方法:
public ListNode reverseListRecursively(ListNode head, ListNode pre) {
  if(head == null) {//当前节点为空,则直接返回指向前一节点的指针
    return pre;
  }
  ListNode next = head.next;//备份当前节点的next指针
  head.next = pre;//将当前节点的next指针指向前一节点
  return reverseListRecursively(next, head);//递归调用方法,此时当前节点为原当前节点的下一个节点,而前一节点为原当前节点
}

public ListNode reverseList(ListNode head) {
  return reverseListRecursively(head, null);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值