leetcode234:回文链表

请判断一个链表是否为回文链表。

示例 1:

输入: 1->2
输出: false
示例 2:

输入: 1->2->2->1
输出: true
方法1:利用列表。
将链表中的每个值都添加进列表中,然后倒序读取得到一个新的列表,判断两个列表是否相等。刚开始出错的地方:注意利用列表的reverse()方法反转列表的时候会对原列表直接更改,而且没有返回值,这个时候就没办法用原列表与反转之后的列表进行对比。所以可以利用切片的方法倒序读取列表[::-1],这样可以得到list_reverse,判断list_reverse == list。

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def isPalindrome(self, head):
        """
        :type head: ListNode
        :rtype: bool
        """
        cur = head
        list_node = []
        while cur:
            list_node.append(cur.val)
            cur = cur.next
        list_node_re = list_node[::-1]
        return list_node == list_node_re

成功
显示详情
执行用时 : 100 ms, 在Palindrome Linked List的Python提交中击败了87.37% 的用户
内存消耗 : 31 MB, 在Palindrome Linked List的Python提交中击败了16.99% 的用户

方法2:快慢指针
(我刚开始想用快慢指针的时候想错了,其实快指针是慢指针速度的2倍就可以了,这样可以将链表在中间部位分开,思路跟寻找链表中间节点那道题类似,但是我当时想的是慢指针应该在head处开始游动,而快指针应该在对称部分开始游动,然而我们不能确定对称部分所以当时就抛弃了这个想法)
利用快慢指针,快指针的速度是慢指针的2倍,如果链表中节点个数为奇数,那么当快指针到链表最后一个节点的时候,慢指针正好到中间节点,这个时候要额外将slow更新为slow.next,然后将它的值与列表中pop处的值比较;如果链表中节点的个数为偶数,那么当快指针指到最后None的时候,慢指针指到链表对称轴的右边一个元素,此时不用更新slow,直接比较slow的值与列表中pop出的值。所以在快慢指针的while loop中,循环条件为fast和fast.next都不为None,然后循环结束之后判断fast是否为None,若为就不用更新slow,否则更新slow

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def isPalindrome(self, head):
        """
        :type head: ListNode
        :rtype: bool
        """
        slow,fast = head,head
        #利用栈的特性,后入栈的后出栈,将前半部分列表的value放进栈,与后半部分的对比
        stack = []
        while fast and fast.next:
            stack.append(slow.val)
            slow = slow.next
            fast = fast.next.next
        # 当stack为空时,说明原链表为空或者只有一个节点,此时一定为回文链表,直接返回True
        if not stack:
            return True
        # 退出循环后,如果fast存在,说明该链表中节点数为奇数,slow指针指在对称部分的左边需要往右游动一次然后开始比较。
        # 如果fast不存在,说明该链表中节点数为偶数,slow指针指在对称部分的右边,此时不需要移动。
        if fast:
            slow = slow.next
        while slow:
            # 如果相等的话就继续往后游动,一旦出现不相等的就返回False
            if stack.pop() == slow.val:
                slow = slow.next
            else:
                return False
        # 一直到slow=None时退出循环,说明链表左右两部分是完全对称的,直接返回False
        return True

显示详情
执行用时 : 96 ms, 在Palindrome Linked List的Python提交中击败了98.60% 的用户
内存消耗 : 30.7 MB, 在Palindrome Linked List的Python提交中击败了38.76% 的用户

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值