回文链表

回文链表(难度:简单)

1

思路

使用快慢指针找到中点,对链表前半部分进行翻转。

复杂度

时间复杂度:O(n)

空间复杂度:O(1)

代码
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
/**
* 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 slow = head, fast = head;
ListNode pre = head, prepre = null;

// 一遍遍历实现翻转前半部分
while(fast != null && fast.next != null){
pre = slow;
slow = slow.next;
fast = fast.next.next; // 若链表长度为偶数,则fast最后会指向null,若为奇数,fast最后会指向最后一个元素
pre.next = prepre;
prepre = pre;
}
// 循环结束后,若为偶数,slow指向后半部分第一个元素,若为奇数,slow指向中间的那个元素

if(fast != null)
slow = slow.next;

while(pre!=null && slow!=null){
if(pre.val != slow.val)
return false;
pre = pre.next;
slow = slow.next;
}
return true;
}
}
2
20191229-214756