洛上言 2023-06-17 21:35 采纳率: 95.4%
浏览 20
已结题

力扣官方给的代码中,这一步为什么是firstHalfNode.next,我觉得应该是firstHalfNode就行了,因为链表反转后得到的结点就是firstHalfNode哇。

力扣官方给的代码中,这一步为什么是firstHalfNode.next,我觉得应该是firstHalfNode就行了,因为链表反转后得到的结点就是firstHalfNode哇。

img

题目:面试题 02.06. 回文链表
代码:

class Solution {
    public boolean isPalindrome(ListNode head) {
        if (head == null) {
            return true;
        }

        // 找到前半部分链表的尾节点并反转后半部分链表
        ListNode firstHalfEnd = endOfFirstHalf(head);
        ListNode secondHalfStart = reverseList(firstHalfEnd.next);

        // 判断是否回文
        ListNode p1 = head;
        ListNode p2 = secondHalfStart;
        boolean result = true;
        while (result && p2 != null) {
            if (p1.val != p2.val) {
                result = false;
            }
            p1 = p1.next;
            p2 = p2.next;
        }        

        // 还原链表并返回结果
        firstHalfEnd.next = reverseList(secondHalfStart);
        return result;
    }

    private ListNode reverseList(ListNode head) {
        ListNode prev = null;
        ListNode curr = head;
        while (curr != null) {
            ListNode nextTemp = curr.next;
            curr.next = prev;
            prev = curr;
            curr = nextTemp;
        }
        return prev;
    }

    private ListNode endOfFirstHalf(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;
    }
}
  • 写回答

2条回答 默认 最新

  • 於黾 2023-06-20 10:49
    关注

    不管逻辑是怎么样的,都不可以返回给firstHalfNode,因为这是个局部变量指针,改变它并不会改变原链表,你返回给它没有意义呀
    如果你确实需要返回给它,那也应该是先找到它的上一级节点,然后将上一级节点的.next赋值
    指针就类似一个写着字的小纸条,它上面的是邮寄地址
    根据地址去邮寄才是应该做的事情,而改写小纸条上的字本身没有意义

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月28日
  • 已采纳回答 6月20日
  • 创建了问题 6月17日