LeetCode-234-回文链表
# LeetCode-234-回文链表
请判断一个链表是否为回文链表。
示例1:
输入: 1->2
输出: false
1
2
2
1
2
2
示例2:
输入: 1->2->2->1
输出: true
1
2
2
1
2
2
进阶: 你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
# 解题思路
方法1、快慢指针+反转链表:
先通过快慢指针找到链表中点
奇偶情况不同,奇数情况应该跳过中心节点,偶数情况中心节点为2个,需要翻转的的位置仍然是slow.next开始
之后进行后半部分的链表反转
反转完成之后分别从链表的头部开始遍历匹配,当两个链表都不为空的时候,不断移动两端指针比较指针的值是否相等
方法2、栈:
先遍历一遍链表,用栈对链表进行顺序存储。由于栈有先进后出的特点,所以只需要再一次遍历链表将栈顶的值和链表中的值进行比较,这样做等价于栈维护了一个逆序链表,所谓回文的意思就是逆序链表和正序链表相同,如果遍历的过程中出现值不相等,那么证明该链表不是回文链表,反之则是回文链表。当然这并不是最优解,因为消耗了O(n)的空间,也遍历了2次链表
# Java代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isPalindrome(ListNode head) {
if(head==null||head.next==null) return true;
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode fast = dummy;
ListNode slow = dummy;
while(fast!=null&&fast.next!=null){
slow = slow.next;
fast = fast.next.next;
}
ListNode head2 = reverseLink(slow.next);
slow.next = null;
while(head!=null&&head2!=null){
if(head.val!=head2.val){
return false;
}else{
head = head.next;
head2 = head2.next;
}
}
return true;
}
public ListNode reverseLink(ListNode head){
if(head==null||head.next==null) return head;
ListNode pre = null;
ListNode cur = head;
while(cur!=null){
ListNode temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# Java代码2
class Solution {
public boolean isPalindrome(ListNode head) {
if(head==null||head.next==null){
return true;
}
Deque<Integer> stack = new LinkedList<>();
ListNode cur = head;
while(cur!=null){
stack.push(cur.val);
cur = cur.next;
}
while(head!=null){
if(head.val!=stack.peek()){
return false;
}
stack.pop();
head = head.next;
}
return true;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
编辑 (opens new window)
上次更新: 2022/11/18, 11:15:10
- 01
- SpringCache基本配置类05-16
- 03
- Rpamis-security-原理解析12-13