定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

反转链表(java实现)

题目描述:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

限制:

0 <= 节点个数 <= 5000 

一:非迭代解法(双指针法)

申请两个指针分别为previous和current

current:表示当前链表的位置(初始化指向头指针)

previous:表示前一位置(初始化指向空)

链表反转时,当前节点指向前一节点

即:current.next = previous;

(值得注意的是,当该步骤执行后,当前节点的下一节点会丢失

解决方法:在该步骤之前再申请一节点(temp)保存当前节点的下一节点位置。

即:temp=current.next;)

后 当前指针和前一指针向前移动

previous = current;

current = temp;

完整代码为:

ListNode pre = null;
ListNode current = head;
ListNode temp = null;
while (current != null) {
    //保存后一个结点的位置
    temp = current.next;
    //将当前节点指向上一节点
    current.next = pre;
    //当前和前一位置向后移动
    pre = current;
    current = temp;
}
return pre;

二:递归解法

递归问题:1:一个问题可以分为若干个子问题

​ 2:某些子问题是原子的,另外一些子问题与原问题的逻辑相同

​ 典型的有汉诺塔问题,求阶乘

​ **注:**然而对于一个问题,能用循环就不用递归(前提是循环结构实现起来比较简单)

​ 递归问题的本质实质就是对栈的使用。

递归结构:

public Status digui(参数0,1,2…){

​ if(终止条件){

​ return;

​ }

​ 逻辑处理(原子,可以存在也可以不存在)

​ //递归调用

​ digui(参数0,1,2…);

​ 逻辑处理(原子,可以存在也可以不存在)

}

对于本题递归时从链表的末尾进行翻转,依次向前

代码实现

public ListNode reverseList(ListNode head) {
    //终止条件当前为空或者下一节点为空
    if (head == null || head.next == null)
        return head;
    //递归调用,找到链表末尾
    ListNode current = reverseList(head.next);
    //对节点进行翻转
    ListNode temp = head.next;
    temp.next = head;
    //此时head表示链表的最后一个节点,应指向null
    head.next = null;
    return current;
}

若有相同请联系我更改

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

panghuhu-Li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值