文章目录
- 🌏引言
- 🧭[链表的回文结构](https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tpId=49&&tqId=29370&rp=1&ru=/activity/oj&qru=/ta/2016test/question-ranking)
- 🚩🚩题目描述:
- 🚩🚩示例:
- 🚩🚩思路解析:
- 🚩🚩🚩寻找中间节点
- 🚩🚩🚩局部翻转
- 🚩🚩🚩判断是否回文
- 🚩🚩完整代码与注意事项
- 🚩🚩🚩注意事项:
- 🚩🚩🚩完整代码
- ⭕总结
🌏引言
单链表的操作算法是笔试面试中较为常见的题目。
本文将着重介绍平时面试中常见的关于链表的应用题目,马上要进行秋招了。希望对你们有帮助 _😀
🧭链表的回文结构
🚩🚩题目描述:
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。
给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
import java.util.*;
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class PalindromeList {
public boolean chkPalindrome(ListNode A) {
// write code here
}
}
🚩🚩示例:
给定链表:11->22->33->22->11
返回值:true
🚩🚩思路解析:
回文字符串的中间节点两边的元素,如果从两头两中间进行比对的话,每一个里面的元素完全相同
🚩🚩🚩寻找中间节点
我们先寻找到中间节点,然后将中间节点后的链表部分进行局部偏转
寻找中间节点时用我们快慢指针的思想
fast:快指针,一次走两步
slow:慢指针,一次走一步
结束条件:
链表元素个数为偶数时:fast.next == null;
链表元素个数为奇数时:fast == null;
寻找中间节点代码如下
ListNode fast = A;
ListNode slow = A;
//找中间节点
while(fast != null||fast.next != null) {
//快指针,一次走两步
fast = fast.next.next;
//慢指针,一次走一步
slow = slow.next;
}
🚩🚩🚩局部翻转
接下来我们要对局部进行翻转
翻转单链表,我们首先设一个cur节点为我们当前所需要翻转的节点;还有一个curNext记录cur下一节点
翻转时:
- 先用curNext记录cur下一节点的位置
- 然后将cur.next置为slow,让cur节点指向slow
- 再将cur节点设为slow
- 最后让cur置为curNext,进行下一节点的翻转
结束条件:cur == null;
代码实现如下
ListNode cur = slow.next;
//局部翻转
while( cur != null) {
ListNode curNext = cur.next;
cur.next = slow;
slow = cur;
cur = curNext;
}
🚩🚩🚩判断是否回文
接下来我们就要判断是否回文
判断思想:
- A节点与slow节点同时向中间节点进行遍历
- 对比其中元素是否相等
- 不相等返回false,相等则继续遍历,直到结束
结束条件:
- 当链表中节点数为奇数时,这时候A与slow会相遇,指向同一位置
- 所以条件为A == slow;
- 当链表中节点为偶数时,这时候A与slow是不会相遇的
- 但是如果两边都遍历完,A的下一节点指向的肯定是slow
- 所以条件为A.next == slow;
代码实现如下:
//判断是否回文
while(slow != A&& A.next != slow) {
if(slow.val != A.val) {
return false;
}
slow = slow.next;
A = A.next;
}
return true;
🚩🚩完整代码与注意事项
🚩🚩🚩注意事项:
- 结束条件不是循环的条件,不要搞混,不然进不去循环😭
- 要注意对传进来的数据进行判断与筛选
🚩🚩🚩完整代码
import java.util.*;
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class PalindromeList {
public boolean chkPalindrome(ListNode A) {
ListNode fast = A;
ListNode slow = A;
//找中间节点
while(fast != null&&fast.next != null) {
//快指针,一次走两步
fast = fast.next.next;
//慢指针,一次走一步
slow = slow.next;
}
ListNode cur = slow.next;
//局部翻转
while( cur != null) {
ListNode curNext = cur.next;
cur.next = slow;
slow = cur;
cur = curNext;
}
//判断是否回文
while(slow != A&& A.next != slow) {
if(slow.val != A.val) {
return false;
}
slow = slow.next;
A = A.next;
}
return true;
}
}
⭕总结
关于《【数据结构】链表的回文结构》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!