递归:回文链表

Posted 我家大宝最可爱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归:回文链表相关的知识,希望对你有一定的参考价值。

回文链表

这个问题其实非常的好理解,比较头节点和尾节点的值,然后不断向中间靠近即可。如果都相等说明就是回文链表,否则不是

这个题一看我就想到了递归,如果是数组的话,非常的好写,比较两侧的字符是否相等,如果不相等直接返回False,否则返回子问题的结果。

arr = [8,4,2,2,4,8]
def dfs(arr, l, r):
    if l >= r: return True
    if arr[l] != arr[r]: return False
    return dfs(arr,l+1,r-1)

res = dfs(arr,0,len(arr)-1)
print(res)

但是当前是链表,没有办法使用L和R来进行比较,而且我还对递归产生了错误的理解,我一直觉得dfs(head)表示的是整条链表,那么子问题dfs(head.next)肯定是表示除了头节点之后链表,这让我怎么都想不明白该如何使用递归,即是看了很多个文章,依然糊里糊涂的

我实在是想不出来怎么做,就去看了一下别人写的代码,发现自己对递归,对递归子问题都思考的太少了

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def isPalindrome(self, head: Optional[ListNode]) -> bool:
        realHead = head

        def dfs(recHead):
            nonlocal realHead
            if recHead is None:
                return True
            sr = dfs(recHead.next)
            r = (realHead.val == recHead.val)
            realHead = realHead.next
            return sr and r

        res = dfs(head)
        return res

分析过后,我才恍然大悟,原来这里的子问题定义的是子链表的每个节点是否与之前对应的每个节点相等,而不是去判断子链表是否是一个回文链表。
然后我就想起之前看到的一句话,递归问题的解就是递归问题的定义。只有定义好递归问题才能更好的解决。比如这个问题,定义的就是子链表是否与前面对应节点的值都相等。

以上是关于递归:回文链表的主要内容,如果未能解决你的问题,请参考以下文章

递归:回文链表

递归:回文链表

递归:回文链表

力扣234. 回文链表 一题五解让你彻底弄懂链表!反转链表法栈法双指针法快慢指针法递归法

LeetCode——回文链表

LeetCode——回文链表