刷题笔记14——反转单链表

206. 反转链表

  • 递归反转的思路很简单,但是最初的思维断在了,如果我将后边这部分的反转完成后,那么我如何让后边这部分的结束续上开始节点呢?还是没有往最小问题上细推,head的next作为反转头节点输入到函数中,这个头结点在递归中仍然是将后续节点反转后作为末尾节点加入进去,hext->next这个属性不会改变
class Solution {
    public ListNode reverseList(ListNode head) {
        if(head==null || head.next==null) return head;

        ListNode last = reverseList(head.next);
        head.next.next = head;
        head.next = null;
        return last;
    }
}
  • 在leetcode中,如果有测试样例的链表为null但是没有加处理的话,所有的结果都会是错的,报错Cannot read field “next” because “” is null
  • 用迭代做反转链表的时候,注意要没有循环,第一次做的时候,将pre直接置为head,这样的话pre指向第二个节点的指针没有断掉,然后第二个节点的指针又会指向pre,成了循环
class Solution {
    public ListNode reverseList(ListNode head) {
        if(head==null) return null;

        ListNode pre = null;
        ListNode cur = head;
        
        while(cur!=null){
            ListNode p = cur.next;
            cur.next = pre;
            pre = cur;
            cur = p;
        }
        
        return pre;
        
    }
}
  • 借助二叉树后序遍历的思路,不需要显式反转原始链表也可以倒序遍历链表,很巧妙,不用修改当前链表
class Solution {
    ListNode left;
    public boolean isPalindrome(ListNode head) {
        left = head;
        boolean res = traverse(head);
        return res;
    }

    boolean traverse(ListNode head){
        if(head==null) return true;
        boolean res = traverse(head.next);
        res = res && (head.val==left.val);
        left = left.next;
        return res;    
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值