数据结构链表题:链表的回文结构

在这里插入图片描述

大家好

我们今天继续整几道题目~

接下来是判断链表的回文结构~

解题目标:
给一个链表的头结点,
判断给定的链表是不是回文结构的链表
是就返回true,不是就返回false

描述

对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。

给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。

测试样例:

1->2->2->1
返回:true

解题思路:

  1. 找到这个链表的中间节点
  2. 将中间节点后面的链表全部反转
  3. 让头结点和中间节点同时遍历
  4. 比较二者的值是否相等, 相等就是回文结构~

如图所示~

在这里插入图片描述
在这里插入图片描述

第一步:找到中间节点:

话不多说: 兄弟们,看代码
关于如何找到链表的中间节点我在之前的文章中写过,和这里的思路一毛一样~
点击这里!!!
找到链表的中间节点

考验一下大家,
看完之后,可以自己试着写出这部分代码~
我写的答案如下~

//xdm, 记得先去自己写一遍哈~
 public boolean chkPalindrome(ListNode head) {
				//找到链表的中间节点; 使用快慢指针的思想
				ListNode fast =  head;
				ListNode slow = head;
				while(fast != null && fast.next != null){
							fast = fast.next.next;
							slow = slow.next;
				}
}

此时,循环走完之后,slow就是我们的中间节点

第二步:将slow后面的链表全部反转

我也在之前写过这类题目~

点击这里~
反转链表

好啦,相信你已经通过上面的文章学会啦,这个题目的大概思路也是如此的

//此时slow为中间节点
ListNode cur = slow.next;
slow.next = null;
ListNode curNext;
while(cur != null){
	curNext = cur.next;
	cur.next = slow;
	slow = cur;
	cur = curNext;
}

反转结束,此时的链表如图所示

第三步: 比较head和slow的值

让head和slow同时向后走,如果head的值和slow的值都相等,则是回文结构

在这里插入图片描述

while(head.next != null && slow.next != null){
			if(head.val != slow.val){
					return false;
			}
			if(head.next == slow){
					return true;			
			}
			//让head和slow同时都向后走
			head   = head.next;
			slow = slow.next;
}
return true;

圆满结束:
完整代码如下:


public boolean chkPalindrome(ListNode head) {
				ListNode fast = head;
				ListNode slow = head;

				while(fast != null && fast.next != null){		
							fast = fast.next.next;
							slow = slow.next;
				}
				ListNode cur = slow.next;
				slow.next = null;
				ListNode curNext;
				while(cur != null){
					curNext = cur.next;
					cur.next = slow;
					slow = cur;
					cur = curNext;
				}
				while(head.next != null && slow.next != null){
						if(head.val != slow.val){
							return false;
						}
						if(head.next == slow){
							return true;
						}
						head = head.next;
						slow = slow.next;
				}
				return true;
}

圆满结束,该题是牛客网上的原题:

链表的回文结构

快去检验一下自己的学习成果吧~

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值