链表的回文结构,比如
1 2 2 1
再比如
上海自来水来自海上
狗日楼主在主楼日狗
也是回文结构
那么如何判断链表是否是回文结构?思路是这样的:
1.先找到链表的中间结点 2.中间节点往后 对后面的结点进行逆置 3.对比前后两个链表的内容是不是完全一样
代码实现:
public boolean chkPalindrome(ListNode head) {
//考虑特殊情况
if (head == null || head.next == null) {
return true;
}
//1.先找到链表的中间结点
int len = size(head);
int steps = len / 2;
ListNode newHead = head;
for (int i = 0; i < steps; i++) {
newHead = newHead.next;
}
//循环结束之后 newHead 已经指向中间节点
//2.中间节点往后 对后面的结点进行逆置
ListNode prev = null;
ListNode cur = newHead;
while (cur != null) {
ListNode next = cur.next;
if (next == null) {
//使用 newHead 指向新链表的头部
newHead.next = cur;
}
cur.next = prev;
prev = cur;
cur = next;
}
//3.对比前后两个链表的内容是不是完全一样
while (newHead != null) {
if (head.val != newHead.val) {
return false;
}
head = head.next;
newHead = newHead.next;
}
return true;
}