回文链表-链表

https://leetcode-cn.com/problems/palindrome-linked-list/

思路1: 先判断链表节点为空,为一个,为两个的情况,利用快慢指针找到中间节点,翻转部分节点

思路2: 先判断链表节点为空,为一个,为两个的情况,翻转链表然后对比(空间复杂度不符合)

 思路2: 也可以先找到中心节点,再用栈来解决

public boolean isPalindrome(ListNode head) {
    if (head == null || head.next == null) return true;
    if (head.next.next == null) return head.val == head.next.val;

// 找到中间节点
       ListNode mid = middleNode(head);
// 翻转右半部分(中间节点的右边部分)
      ListNode rHead = reverseList(mid.next);
      ListNode lHead = head;
      ListNode rOldHead = rHead;

// 从lHead、rHead出发,判断是否为回文链表
      boolean result = true;
      while (rHead != null) {
         if (lHead.val != rHead.val) {
             result = false;
            break;
         }
         rHead = rHead.next;
          lHead = lHead.next;
     }

// 恢复右半部分(对右半部分再次翻转)
    reverseList(rOldHead);
   return result;


private ListNode middleNode(ListNode head) {
     ListNode fast = head;
     ListNode slow = head;
    while (fast.next != null && fast.next.next != null) {
       slow = slow.next;
       fast = fast.next.next;
}
    return slow;
}

private ListNode reverseList(ListNode head) {
    ListNode newHead = null;  
    while (head != null) {
      ListNode tmp = head.next;
      head.next = newHead;
      newHead = head;
      head = tmp;
}
   return newHead;
}

posted @ 2021-06-26 18:35  syh-918  阅读(41)  评论(0)    收藏  举报