程序员面试经典-20200222

20200222

题目 :回文链表。编写一个函数,检查输入的链表是否是回文。

示例 2:

输入:1->2->2->1
输出: true 

思路 :使用快慢指针,让后半部分链表反转,然后比较前半部分和后半部分链表是否相等。

code :

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);
    
    //compose
    while(rHead != null){
        if(rHead.val != head.val) return false;
        rHead = rHead.next;
        head = head.next;
    }
    return true;
}
//find middleNode
private ListNode middleNode(ListNode head){
    ListNode fast = head;
    ListNode slow = head;
    while(fast.next != null && fast.next.next != null){
        fast = fast.next.next;
        slow = slow.next;
    }
    return slow;
}

//reverse listnode
private ListNode reverseList(ListNode head){
    ListNode newHead = null;
    while(head != null){
        ListNode temp = head.next;
        head.next = newHead;
        newHead = head;
        head = temp;
    }
    return newHead;
}
发布了94 篇原创文章 · 获赞 13 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_31900497/article/details/104440084