当前位置:网站首页>Leetcode algorithm refers to offer II 027 Palindrome linked list
Leetcode algorithm refers to offer II 027 Palindrome linked list
2022-06-24 22:44:00 【Alex_ 12 hours a day 6 days a week】
Topic link : The finger of the sword Offer II 027. Palindrome list
Ideas
Algorithm : Double pointer
data structure : Linked list
Ideas : First, turn the second half of the list over , Then use two pointers to traverse from the beginning and from the middle to determine whether they are the same , If it is the same, it is a palindrome linked list , Otherwise, it's not a palindrome linked list , But whether it is a palindrome linked list or not , The flipped linked list still needs to be flipped back .
1. Use the speed pointer , Quick pointer quick Two steps at a time , Slow pointer slow One step at a time , When the pointer comes to the end , The slow pointer is right in the middle of the linked list ;( If the length of the list is odd , The fast pointer finally goes to the last element , If the length of the list is even , The fast pointer finally goes to the penultimate element )
2. Start from the middle of the linked list , Flip the following nodes one by one , That is, the current node originally points to the next node , Change to point to the previous node ;
3. Double pointers start from the beginning and end of the linked list respectively , Traverse to determine whether the current node values are equal , End when the two pointers finally meet ;
4. Start from the middle of the linked list , Then flip the following nodes back .
Code
C++
class Solution {
public:
bool isPalindrome(ListNode* head) {
if (head == nullptr || head->next == nullptr) {
return true;
}
// 1. The speed pointer finds the middle position of the linked list
ListNode *quick = head, *slow = head;
while (quick->next != nullptr && quick->next->next != nullptr) {
slow = slow->next;
quick = quick->next->next;
}
// 2. Flip the subsequent nodes from the middle of the linked list
ListNode *cur = slow->next;
slow->next = nullptr;
while (cur != nullptr) {
ListNode *nxt = cur->next;
cur->next = slow;
slow = cur;
cur = nxt;
}
// 3. Double pointers traverse from the beginning to the end
bool res = true;
quick = head;
ListNode *tail = slow;
while (quick != nullptr && slow != nullptr) {
if (quick->val != slow->val) {
res = false;
break;
}
quick = quick->next;
slow = slow->next;
}
// 4. Flip the flipped node back
cur = tail->next;
tail->next = nullptr;
while (cur != nullptr) {
ListNode *nxt = cur->next;
cur->next = tail;
tail = cur;
cur = nxt;
}
return res;
}
};
Of course , If you find double pointers troublesome , You can also traverse the linked list, save it to the array, and then determine whether it is a palindrome .
class Solution {
public:
bool isPalindrome(ListNode* head) {
vector<int> values;
while (head) {
values.push_back(head->val);
head = head->next;
}
for (int i = 0, j = values.size() - 1; i < j; i++, j--) {
if (values[i] != values[j]) {
return false;
}
}
return true;
}
};
Python
class Solution:
def findFirstHalfEnd(self, node):
fast = slow = node
while fast.next is not None and fast.next.next is not None:
fast = fast.next.next
slow = slow.next
return slow
def reverseList(self, node):
previous, current = None, node
while current is not None:
nextNode = current.next
current.next = previous
previous = current
current = nextNode
return previous
def isPalindrome(self, head: ListNode) -> bool:
# Judge the boundary
if head is None:
return True
# Find the node of the first half of the linked list and reverse the second half of the linked list
firstHalfEnd = self.findFirstHalfEnd(head)
secondHalfStart = self.reverseList(firstHalfEnd.next)
# Judge whether it is palindrome
ans, firstPosition, secondPosition = True, head, secondHalfStart
while ans and secondPosition is not None:
if firstPosition.val != secondPosition.val:
return False
firstPosition = firstPosition.next
secondPosition = secondPosition.next
# Restore inverted linked list
firstHalfEnd.next = self.reverseList(secondHalfStart)
return ans
边栏推荐
- CA Zhouji - the first lesson in 2022 rust
- Online filing process
- Pinduoduo updates the merchant live broadcast service agreement and strictly punishes the illegal merchants
- A girl has been making hardware for ten years. 。。
- ACL (access control list) basic chapter - Super interesting learning network
- Why can some programmers get good offers with average ability?
- 问题求解——嵌套列表
- Short video mall system, how does scroll view adapt to the remaining height of the page
- Chapter 10 project communication management
- AttacKG: Constructing Technique Knowledge Graph from Cyber Threat Intelligence Reports代码复现
猜你喜欢

Future development of education industry of e-commerce Express

Servlet details

How to automatically remove all . orig files in Mercurial working tree?

ThreadLocal local thread

NIO 零拷贝

Power system | IEEE paper submission process

电力系统| IEEE论文投稿流程

【个人实验报告】

High level application of SQL statements in MySQL database (II)

Uncover the secret of station B. is it true that programmers wear women's clothes and knock code more efficiently?
随机推荐
JWT(Json Web Token)
Principle of IP routing
CDN principle
Code farmers should also understand the IPv4 subnet division of point networks
Feign project construction
中国SSD行业企业势力全景图
ThreadLocal memory leak
Row and column differences in matrix construction of DX HLSL and GL glsl
interrupt、interrupted 、isInterrupted 区别
Extend your kubernetes API with aggregated apiserver
详细了解关于sentinel的实际应用
AttacKG: Constructing Technique Knowledge Graph from Cyber Threat Intelligence Reports代码复现
堆內存分配的並發問題
Programmers become gods by digging holes in one year, carrying flags in five years and becoming gods in ten years
Main steps of system test
结合源码剖析Oauth2分布式认证与授权的实现流程
Leetcode: calculate the number of elements less than the current element on the right (sortedlist+bisect\u left)
The core concept of JMM: happens before principle
Docker 安装 Redis-5.0.12,详细步骤
Chapter 10 project stakeholder management