234. 回文链表

请判断一个链表是否为回文链表。

示例 1:

输入: 1->2
输出: false

示例 2:

输入: 1->2->2->1
输出: true
 1 import java.util.ArrayList;
 2
 3 public class PalindromeLinkedList {
 4     static class ListNode {
 5         int val;
 6         ListNode next;
 7         ListNode(int x) {
 8             val = x;
 9         }
10     }
11
12     //方法一:遍历链表,将数据存储在集合中,然后将集合的头尾进行遍历
13     public boolean isPalindrome(ListNode head) {
14         ListNode current = head;
15         ArrayList<Integer> arr = new ArrayList<>();
16         while(current != null) {
17             arr.add(current.val);
18             current = current.next;
19         }
20         int len = arr.size();
21         int first = 0;
22         int last = len-1;
23         while(first<last) {
24             if(!arr.get(first).equals(arr.get(last))) {
25                 return false;
26             }
27             first++;
28             last--;
29         }
30         return true;
31     }
32
33     //方法二:快慢指针查找链表的中点,将链表切断为两部分,对后一半的链表进行反转,再与前一半的链表进行比较
34     public boolean isPalindrome2(ListNode head) {
35         if(head == null || head.next == null) {
36             return true;
37         }
38         ListNode slow = head;
39         ListNode fast = head;
40         //利用快慢指针查找中间节点,一个移动1个节点,另一个移动两个节点,当快指针移动到末尾时,慢指针移动到中间
41         while(fast != null && fast.next != null) {
42             slow = slow.next;  //当fast为null时,节点数为偶数,slow为中间偏右
43             fast = fast.next.next;  //当fast不为null时,节点数为奇数,slow为正中间
44         }
45         cutLinkedList(head, slow);
46         ListNode backHalf = reverse(slow);
47         while(head != null && backHalf != null) {
48             if(head.val != backHalf.val) {
49                 return false;
50             }
51             head = head.next;
52             backHalf = backHalf.next;
53         }
54         return true;
55     }
56     public static void cutLinkedList(ListNode head, ListNode cutNode) {
57         while(head.next != cutNode) {
58             head = head.next;
59         }
60         head.next = null;
61     }
62     public static ListNode reverse(ListNode head) {
63         ListNode newHead = null;
64         while(head != null) {
65             ListNode next = head.next;
66             head.next = newHead;
67             newHead = head;
68             head = next;
69         }
70         return newHead;
71     }
72 }

原文地址:https://www.cnblogs.com/xiyangchen/p/11057810.html

时间: 2024-08-29 23:45:42

234. 回文链表的相关文章

LeetCode 234——回文链表

1. 题目 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题? 2. 思路 此题可以看做是反转链表 和 链表中间结点 的结合. 定义快慢两个指针,寻找中间结点,同时在慢指针移动的过程中反转前半部分子链表.当找到中间结点时,再分别向前向后比较前后两个子链表的每一个结点值是否相同. 偶数结点情况如下 此时,我们分别得到了以

Leetcode 234. 回文链表(进阶)

题目描述: 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题? 解法一:(空间复杂度O(n)) 遍历一遍链表压栈,借助栈把链表倒序,然后依次比较"原链表元素"和"新栈中元素",如果都相等则返回true,否则返回false. 这样简单粗暴,代码的主体包含在解法二中了,这里不列出了.

234. 回文链表 Palindrome Linked List

Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) time and O(1) space? 判断一个链表是否为回文串 思路:1.找到中间点,2.反转后半部分链表,3.判断前半部分与后半部分是否相同 /** * Definition for singly-linked list. * public class ListNode { * public int v

Leetcode 234. 回文链表

bool isPalindrome(ListNode* head) { ListNode* fast = head; ListNode* slow = head; //如果没有元素 if(head==NULL) return true; //如果就一个元素 if(fast->next==NULL) return true; //如果就两个元素 if(fast->next->next==NULL) return fast->val == fast->next->val;

【Leetcode链表】回文链表(234)

题目 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题? 解答 两种方法: 遍历链表,用数组存值,再比较.时间复杂度O(n),空间复杂度O(n) 指针法:找到中点,反转中点之后的链表,再比较.时间复杂度O(n),空间复杂度O(1) 通过代码如下: # Definition for singly-linked list.

lintcode 中等题:Palindrome Linked List 回文链表

题目 回文链表 设计一种方式检查一个链表是否为回文链表. 样例 1->2->1 就是一个回文链表. 挑战 O(n)的时间和O(1)的额外空间. 解题 法一: 再定义一个链表,存放链表反转的值,再以此比较两个链表中的值是否相等,时间复杂度O(N),空间复杂度O(N) /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { v

如何判断一个单向链表是否为回文链表(Palindrome Linked List)

题目:给定一个单向链表,判断它是不是回文链表(即从前往后读和从后往前读是一样的).原题见下图,还要求了O(n)的时间复杂度O(1)的空间复杂度. 我的思考: 1,一看到这个题目,大脑马上想到的解决方案就是数组.遍历链表,用数组把数据存下来,然后再进行一次遍历,同时用数组反向地与之比较,这样就可以判断是否回文.这个方法时间复杂度是O(n),达到了要求,然而空间复杂度显然不满足要求.所以,开数组这一类的方法显然不是最佳的. 2,既然要满足O(1)的空间复杂度,我就想到了用一个变量来存储这些数据,恰好

[CareerCup] 2.7 Palindrome Linked List 回文链表

2.7 Implement a function to check if a linked list is a palindrome. LeetCode上的原题,参见我之前的博客Palindrome Linked List 回文链表.

【leetcode 简单】 第六十七题 回文链表

请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题? # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def r