力扣题目:回文链表
开篇
今天是备战蓝桥杯的第23天。我加入的编程导航算法通关村也在今天开营啦!那从现在起,我的算法题更新会按照算法村的给的路线更新,更加系统。大家也可以关注我新开的专栏“算法通关村”。里面会有更全面的知识点和题目的分享。
题目链接: 234.回文链表
题目描述
代码思路1
1.一开始写的时候,感觉在链表里操作太麻烦了,就利用list集合把链表里的元素存起来,然后在链表里判断就行(也可以放数组里)
2.既然存在集合里,那回文数的判断就轻轻松松喽。这里我使用左右指针,一个在头,一个在尾,两个指针同时往中间移动,只要有一次两个指针对应的数据不相等,则不是回文
代码纯享版
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public boolean isPalindrome(ListNode head) {
List<Integer> list = new ArrayList<>();
ListNode node = head;
while(node != null){
list.add(node.val);
node = node.next;
}
int left = 0, right = list.size() - 1;
while(left < right){
if(list.get(left) != list.get(right)) return false;
left++;
right--;
}
return true;
}
}
代码逐行解析版
class Solution {
public boolean isPalindrome(ListNode head) {
List<Integer> list = new ArrayList<>(); //创建list集合
ListNode node = head; //创建结点node指向头结点
while(node != null){ //当node不为空时
list.add(node.val); //将该结点添加到集合中
node = node.next; //node指向下一个结点
}
int left = 0, right = list.size() - 1; //创建左右指针,分别指向集合到开头和结尾
while(left < right){ //循环条件是两个指针相遇前
if(list.get(left) != list.get(right)) return false; //两个指针对应的数如果不相等,则不是回文,返回false
left++; //左指针右移
right--; //右指针左移
}
return true;//没有false的情况,返回true
}
}
代码思路2
上面第一种方法被算法村的讲义说是逃避链表,面试不能这样,只能含泪考虑其他思路。
第二种思路是利用栈后进先出的特点,先把整个链表压入栈中,然后同时遍历链表和输出栈顶元素,一一比较,不相同则不是回文数
代码纯享版
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public boolean isPalindrome(ListNode head) {
Stack<Integer> stack = new Stack<>();
ListNode node = head;
while(node != null){
stack.push(node.val);
node = node.next;
}
node = head;
while(node != null){
if(stack.pop() != node.val) return false;
node = node.next;
}
return true;
}
}
代码逐行解析版
class Solution {
public boolean isPalindrome(ListNode head) {
Stack<Integer> stack = new Stack<>(); //创建一个栈
ListNode node = head; //创建node结点指向头结点
while(node != null){ //node不为空时
stack.push(node.val);//把node结点的值压入栈中
node = node.next; //node指向下一个结点
}
node = head; //node重新指向头结点
while(node != null){ //node不为空时
if(stack.pop() != node.val) return false; //栈顶元素出栈,如果栈顶元素与node结点的值不相等,返回false
node = node.next; //node指向下一个结点
}
return true;//没有false的情况,返回true
}
}
结语
如果这道题的分享对您有所帮助,点个关注,我会每天更新力扣题的讲解,与大伙儿一起向前迈进!