反转并比较回文解决方案(破解编码面试)
Reverse and Compare Palindrome Solution (Cracking the Coding Interview)
所以我正在阅读 Cracking the Coding Interview 一书。我正在处理这个问题:
"Implement a function to check if a linked list is a palindrome"
我注意到第一个解决方案(第 217 页)仅提供一个节点作为函数的参数,而不是整个列表。我只是想知道,在没有提供列表的情况下,函数如何知道列表中的下一个节点?
为了以防万一,我提供了下面的代码。
boolean isPalindrome(LinkedListNode head){
LinkedListNode reversed = reverseAndClone(head);
return isEqual(head, reversed);
}
LinkedListNode reverseAndClone(LinkedListNode node){
LinkedListNode head = null;
while(node != null){
LinkedListNode n = new LinkedListNode(node.data);
n.next = head;
head = n;
node = node.next;
}
return head;
}
boolean isEqual(LinkedListNode one, LinkedListNode two) {
while(one != null && two != null){
if (one.data != two.data){
return false;
}
one = one.next;
two = two.next;
}
return one == null && two == null;
}
在链表中,每个节点都有自己的数据和对列表中下一个节点的引用(并且可能还指向前一个项目,在双向链表中,这似乎不是这种情况这里)。所以你真的不需要列表包装器来获取它的所有数据,只需要引用第一个节点(头),如你包含的代码片段所示。
所以我正在阅读 Cracking the Coding Interview 一书。我正在处理这个问题:
"Implement a function to check if a linked list is a palindrome"
我注意到第一个解决方案(第 217 页)仅提供一个节点作为函数的参数,而不是整个列表。我只是想知道,在没有提供列表的情况下,函数如何知道列表中的下一个节点?
为了以防万一,我提供了下面的代码。
boolean isPalindrome(LinkedListNode head){
LinkedListNode reversed = reverseAndClone(head);
return isEqual(head, reversed);
}
LinkedListNode reverseAndClone(LinkedListNode node){
LinkedListNode head = null;
while(node != null){
LinkedListNode n = new LinkedListNode(node.data);
n.next = head;
head = n;
node = node.next;
}
return head;
}
boolean isEqual(LinkedListNode one, LinkedListNode two) {
while(one != null && two != null){
if (one.data != two.data){
return false;
}
one = one.next;
two = two.next;
}
return one == null && two == null;
}
在链表中,每个节点都有自己的数据和对列表中下一个节点的引用(并且可能还指向前一个项目,在双向链表中,这似乎不是这种情况这里)。所以你真的不需要列表包装器来获取它的所有数据,只需要引用第一个节点(头),如你包含的代码片段所示。