题目描述:
给你一个单链表的头节点 head
,请你判断该链表是否为回文链表。如果是,返回 true
;否则,返回 false
。
示例 1:
输入:head = [1,2,2,1]
输出:true
示例 2:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4K3ffECf-1682607859988)(null)]
输入:head = [1,2]
输出:false
提示:
- 链表中节点数目在范围
[1, 105]
内 0 <= Node.val <= 9
思路:
- 1.使用栈,遍历链表,将每一个节点的值加入到栈内,然后将逐个栈内元素出栈与链表元素对比是否相等
代码(思路1):
/**
* 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(node.val != stack.pop())
return false;
node = node.next;
}
return 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) {
List<Integer> list = new ArrayList<>();
ListNode node = head;
while(node!=null){
list.add(node.val);
node = node.next;
}
int back = list.size()-1;
int font = 0;
while(back >= font){
if(!list.get(back).equals(list.get(font)))
return false;
font++;
back--;
}
return true;
}
}