234. 回文链表

1. 题目:
请判断一个链表是否为回文链表。

示例1:
    输入: 1->2
    输出: false
    
示例2:
    输入: 1->2->2->1
    输出: true
2. 思路:
设置两个快慢指针,快指针走到链表末尾时,慢指针恰好在链表中间节点,翻转后半部分链表,逐一比对两个链表的数值是否相等。
3. 代码:
        ListNode preNode = new ListNode(-1);
    preNode.next = head;
    ListNode slow = preNode;
    ListNode fast = preNode;
    //慢指针走一步,快指针走两步
    while (fast != null && fast.next != null){
        slow = slow.next;
        fast = fast.next.next;
    }
    ListNode node1 = null;
    //快指针指向慢指针下一个,并断开链表
    fast = slow.next;
    slow.next = null;
    //翻转链表
    while (fast != null) {
        ListNode nextTemp = fast.next;
        fast.next = node1;
        node1 = fast;
        if (nextTemp != null){
            fast = nextTemp;
        }else {
            break;
        }
    }
    slow = preNode.next;
    //逐一比较两个链表值是否相等
    while (fast != null){
        if (fast.val == slow.val){
            slow = slow.next;
            fast = fast.next;
        }else {
            return false;
        }
    }
    return true;
}
posted @ 2019-12-31 11:11  咸鱼呀咸鱼  阅读(94)  评论(0)    收藏  举报