leetcode刷题之回文链表

本文详细介绍了两种判断链表是否为回文的方法:一是利用栈的特性,从链表头部和尾部同时遍历比较;二是通过快慢指针找到链表中点,反转后半部分链表再进行对比。这两种思路都巧妙地利用了数据结构特性,有效解决了链表问题。
摘要由CSDN通过智能技术生成

第一种思路:利用栈

public boolean ispalindrome(ListNode head) {
 		Stack<ListNode> stack=new Stack<>();
 		ListNode tmp=head;
 		while(head!=null) {.     //⚠️,不能写成head.next!=null
 			stack.push(head);
 			head=head.next;
 		}
 		while(tmp!=null) {. //同理,不能写成tmp.next!=null
 			if(tmp.val!=stack.pop().val) {
 				return false;
 			}
 			tmp=tmp.next;	
 		}
 		return true;
 	}

思路简述

本题的基本思路就是利用回文串的特性,从链表头部开始遍历和尾部开始遍历所经历的元素应该是完全一致的。所以就利用栈先进后出的性质,先创建一个栈来存储链表内容,然后把pop出的元素数值和从链表头部开始遍历的元素数值一一进行比较,如果完全一致就返回true。

第二种思路:反转后半部分链表

 public ListNode reverse(ListNode head) {
        if(head==null||head.next==null) {
            return head;
        }
        ListNode cur=reverse(head.next);
        head.next.next=head;
        head.next=null;
        return cur;
    }
    
    public boolean isPalindrome(ListNode head) {
        ListNode fast=head;
        ListNode slow=head;
        while(fast!=null&&fast.next!=null) {//注意要把fast!=null放在fast.next!=null前面,防止空指针错误。
            fast=fast.next.next;
            slow=slow.next;
        }//这个循环是为了让slow指向链表中央的节点。
        //slow=slow.next;
        fast=head;
        slow=reverse(slow);//反转后半段链表
        while(slow!=null) {//进行比较
            if(fast.val!=slow.val) {
                return false;
            }
            slow=slow.next;
            fast=fast.next;
        }
        return true;

    }

思路简述

这个题的主要思路就是利用快慢指针,将快指针的步速设置为慢指针的两倍,这样当快指针遍历完时,慢指针正好指向链表中间节点。然后对慢指针指向的后半段链表执行反转操作。将快指针调到链表头节点。然后快慢指针逐一进行对比,判断其值是否相同。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值