LC234 - 回文链表
PalindromeLinkedList.go |
---|
| package LinkedList
func isPalindrome(head *ListNode) bool {
if head == nil || head.Next == nil {
return true
}
// (1) 快慢指针寻找链表中点
slow, fast := head, head
for fast.Next != nil && fast.Next.Next != nil {
slow = slow.Next
fast = fast.Next.Next
}
if fast.Next != nil {
fast = fast.Next
}
// (2) 反转后面的链表
reverseList(slow)
// (3) 遍历两个链表逐个节点比较
ptr1, ptr2 := head, fast
for ptr1 != nil && ptr2 != nil && ptr1.Val == ptr2.Val {
ptr1 = ptr1.Next
ptr2 = ptr2.Next
}
var result bool
if ptr1 == nil || ptr2 == nil {
result = true
} else {
result = false
}
// (4) 反转回后面的链表
reverseList(fast)
return result
}
|
reverseList
函数在LC206中实现。
此处之所以选择反转后面的链表而非前面的链表,是为了防止出现链表断开,从而简化编码难度。