剑指 Offer 24(链表篇2).反转链表

剑指 Offer 10(链表篇2).反转链表

问题描述:

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

解题思路:

了解链表本身的性质,学会利用递归和栈的思想,具体详情见代码注释。

示例:

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

利用迭代的方法实现链表反转

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { 
 *        val = x; 
 *     }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        //引用ListNode类创建一个新的结点node,里面存储元素为空
        ListNode node = null;
        //当链表中存储的元素不为空时
        while(head != null){
            //创建一个现在的结点为头结点的下一个结点
            ListNode cur = head.next;
            //让头结点的下一个结点传递到node结点
            head.next = node;
            //使node结点为头结点,开始对链表里的元素进行反转
            node = head;
            head = cur;
        }
        //更新node结点
        return node;
    }
}

利用递归的方法实现链表反转

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { 
 *        val = x; 
 *     }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        //如果头结点和头结点的下一个结点为空,不用考虑反转,直接返回头结点即可
        if(head == null || head.next == null){
            return head;
        }
        //递归调用head.next相当于遍历了所有结点
        ListNode node = reverseList(head.next);
        //设定原现结点cur为head.next
        ListNode cur = head.next;
        //由于反转需要将现结点cur的下一个结点指向head头结点
        cur.next = head;
        //根据题目要求头结点指向空
        head.next = null;
        return node;
    }    
}

利用栈实现链表反转

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { 
 *        val = x; 
 *     }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        //如果头结点为空,不用考虑反转,直接返回头结点即可
        if(head == null){
            return head;
        }
        //建立一个栈利用栈的思想将元素反转
        Stack<ListNode> stack = new Stack<>();
        //当头结点不为空时
        while(head != null){ 
            //从头结点开始依次放入链表元素
            stack.push(head);
            head = head.next;
           
        }
        //由于链表输出需要头结点,原有的头结点已经不能使用,将第一个弹出栈的元素即为原头结点建立为新个头节点
        ListNode newHead = stack.pop();
        ListNode newNode = newHead;
        while(!stack.isEmpty()){
            ListNode cur = stack.pop();
            //头结点的下一个结点为为栈中弹出的第二个元素
            newNode.next = cur;
            //改变头结点的位置
            newNode = cur;
        }
        //根据市里要求,最后结果输出为null
        newNode.next = null;
        return newHead;
    }    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

原来如此呀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值