leetcode-链表-Palindrome Linked List

Palindrome Linked List


描述

Given a singly linked list, determine if it is a palindrome.
Example 1:
Input: 1->2
Output: false
Example 2:
Input: 1->2->2->1
Output: true


思路

1.翻转链表,逐一比较 (占用过多空间)
2.翻转前半部分链表 找到分半


代码

class Solution:
def isPalindrome(self, head: ‘ListNode’) -> ‘bool’:
if not head or not head.next:
return True
elif not head.next.next:
return head.val == head.next.val
prev = None
fast = slow = head
while fast.next and fast.next.next:
fast = fast.next.next
# reverse the list as we move the slow node
tmp = slow.next
slow.next, prev = prev, slow
slow = tmp
#slow表示前半部分 fast表示后半部分
#由于翻转有限 slow最后指向结点
if fast.next:
fast = slow.next
slow.next = prev
else:
fast = slow.next
slow = prev
# 对两半链表进行比较
while fast:
if fast.val != slow.val:
return False
fast = fast.next
slow = slow.next
return True


C++

Definition for singly-linked list.
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
public:
bool isPalindrome(ListNode* head) {
if (head NULL or head->nextNULL)
return true;
if (head->next->next==NULL)
return head->val ==head->next->val;
ListNode * slow = head;
ListNode * fast = head;
ListNode * prev = NULL;
ListNode * nexttmp = NULL;
while(fast->next !=NULL and fast->next->next != NULL)
{
fast = fast->next->next;
nexttmp = slow->next;
slow->next = prev;
prev = slow;
slow = nexttmp;
}
if (fast->next ==NULL)
{
fast = slow->next;
slow = prev;
}
else{
fast = slow->next;
slow->next = prev;
}
while(fast)
{
if (fast->val != slow->val)
return false;
fast = fast->next;
slow = slow->next;
}
return true;
}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值