leetcode链表回文的基础回顾

博主作为一名Java初学者,决定先从最简单直接的方法做起,并从中加强基础,之后再用其他更简单的方法。

请判断一个链表是否为回文链表

class Solution {
    public boolean isPalindrome(ListNode head) {
        
        if(head == null || head.next == null) return true;
        ListNode fast = head;
        ListNode slow = head;
        ListNode pre = null;
        //1.快慢指针,找到链表的中点。
        while(fast != null && fast.next != null){
            slow = slow.next;
            fast = fast.next.next;
        }

        //2.将slow之后链表反转
        while(slow != null){
            ListNode next = slow.next;
            slow.next = pre;
            pre = slow;
            slow = next;
        } 

        //3.前后链表进行比较,注意若为奇数链表,多1一个节点,然而并不影响判断回文
        while(head != null && pre != null){
            if(head.val != pre.val) return false;
            head = head.next;
            pre = pre.next;
        }
        return true;
    }
}

基础回顾

主要是找到链表的中点并对中点后的链表进行反转。找中点通过快慢指针,在纸上画图一目了然,反转链表又是一个典型题。

leetcode反转链表题

public class Solution {
    public ListNode ReverseList(ListNode head) {
        ListNode pre = null;
        ListNode cur = head;
        if(head == null || head.next == null) return head;
        while(cur != null){
            //暂存
            ListNode temp = cur.next;
            //指向
            cur.next = pre;
            //归位
            pre = cur;
            cur = temp;
        }
        return pre;
    }
}

反转链表分三步走:

  • 1、暂存,用temp指向cur.next,这样取出cur后,cur.next后的链表不会被回收。
  • 2、指向,让取出的cur指向pre,第一次while循环中的pre为null。
  • 3、归位,先归位pre,再归位cur,这样能保证归位成功。

相似类型leetcode合并有序链表题

class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        //通过哑结点dummyHead指向较小的链表
        //move作为遍历链表的辅助指针
		ListNode dummyHead = new ListNode(-1);
        ListNode move = dummyHead;
        while(l1 != null && l2 != null){
            if(l1.val < l2.val){
                move.next = l1;
                l1 = l1.next;
                move = move.next;
            }else{
                move.next = l2;
                l2 = l2.next;
                move = move.next;
            }
        }
        
		//链表为空则直接指向另一个链表
        if(l1 == null) move.next = l2;
        if(l2 == null) move.next = l1;
        return dummyHead.next;

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值