leetcode206 反转链表!!!!!Java

反转链表

题目描述:

反转一个单链表。
这道题的难点在于熟练运用迭代和递归。

示例:

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

思路一:迭代

 1->2->3->4->5 
 1<-2<-3<-4<-5
要完成这种变化我们观察,1指向的元素指向它自己
指向的意思就是next指针
翻译成代码语言就是 节点 p.next.next = p
那我们的工作就是对每一个节点进行next指针的修改
但是这是单链表想要指向前一个节点,我们要自己把前一个节点存起来
修改完next指针我们原来指向的后面的节点就没啦,所以还要先保存一下。
 	框架就是:
 	一、设置当前要进行处理的节点(从头到尾进行循环)
 	二、保存当前节点的前一个节点
 	三、保存当前节点的下一个节点
 	四、修改当前节点的next指针
 	五、处理完成进行下一个节点(两个善后工作:更新前一个节点和当前节点)
 	代码:
	public ListNode reverseList(ListNode head) {
    ListNode prev = null;
    ListNode curr = head;
    while (curr != null) {
        ListNode nextTemp = curr.next;
        curr.next = prev;
        prev = curr;
        curr = nextTemp;
    }
    return prev;
}

思路二:递归

递归的重要思路就是假装除了当前节点, 后面的节点都已经处理完了
即使实际上我们并没有处理,我们也把后面的都塞给处理函数
也就是相当于我们只处理一个链表的头结点,假设除了头节点都处理完了
那对头节点我们只需要进行三个操作:
	一、假设后面的已经排好了(排好之后的头结点是原来的最后一个,用p来存储)
		 ListNode p = reverseList(head.next);
	二、让后面已经反转完成的链表指向它
		 head.next.next = head;
	三 、修改他的next指针,让他指向空
		head.next = null;
	四、现在反转好的链表就是以p为头节点的链表了
		return p;
代码:
class Solution {
    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;
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值