题目描述
给你一个单链表的头节点 head
,请你判断该链表是否为回文链表。如果是,返回 true
;否则,返回 false
。
示例1
1 2
| 输入:head = [1,2,2,1] 输出:true
|
示例2
1 2
| 输入:head = [1,2] 输出:false
|
题解
- 双指针法找到链表的中间节点(注意:奇数个节点时
fast
不为空,fast.next
为空,需要将中间节点slow
往后移动一位);
- 中间节点开始的后半部分链表反转;
- 两个链表的节点一个一个比较节点的
val
:如果相等就一直后移直到后半部分链表遍历结束,说明是回文链表;如果有不相等的节点值,则不是回文链表,终止循环。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| func isPalindrome(_ head: ListNode?) -> Bool { var slow = head var fast = head?.next while(fast !== nil && fast?.next !== nil) { slow = slow?.next fast = fast?.next?.next } if fast !== nil && fast?.next === nil { slow = slow?.next } var isPalindrome = true fast = head slow = reverseList(slow) while slow !== nil { if fast!.val == slow!.val { fast = fast?.next slow = slow?.next } else { isPalindrome = false break } } return isPalindrome }
func reverseList(_ head: ListNode?) -> ListNode? { var pre: ListNode? = nil var cur: ListNode? = head while(cur !== nil) { let tmp = cur?.next cur?.next = pre pre = cur cur = tmp } return pre }
|