当前位置:网站首页>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
边栏推荐
- 故障安全移动面板KTP900F Mobile下载程序提示无法下载,目标设备正在运行或未处于传输模式的解决办法
- 面试害怕被问MySQL相关问题 ?这份三万字精华总结 + 面试100 问,吊打面试官完全够了
- Principles of Ethernet port mirroring, link aggregation and VLAN Technology
- The core concept of JMM: happens before principle
- 1. fully explain the basic principles of IPSec
- Data communication and physical network
- Docker installs MySQL 8.0. Detailed steps
- Genesis public chain and a group of encryption investors in the United States gathered in consensus 2022
- [ingénierie logicielle] points clés à la fin de la période
- CA Zhouji - the first lesson in 2022 rust
猜你喜欢

nuScenes——数据集配置过程中遇到图像文件缺失或大小为0时的补救方法

1. fully explain the basic principles of IPSec

Docker 安装 Redis-5.0.12,详细步骤
Relationnet++: a representation of fusion of multiple detection targets based on transformer | neurips 2020

Learning bit segment (1)

Chapter 10 project stakeholder management

Unable to use the bean introduced into the jar package

DX 的 HLSL 和 GL 的 GLSL的 矩阵构建的行列区别

Redis hop table

CDN principle
随机推荐
上新了,华为云开天aPaaS
Heavyweight! Fada is listed as a "specialized and new" enterprise
Web攻击之CSRF和SSRF
DX 的 HLSL 和 GL 的 GLSL的 矩阵构建的行列区别
find your present (2)
Genesis公链与美国一众加密投资者齐聚Consensus 2022
Leetcode: calculate the number of elements less than the current element on the right (sortedlist+bisect\u left)
CDN principle
Selection and comparison of message oriented middleware MQ
Common voting governance in Dao
Basic principles of spanning tree protocol
Why can some programmers get good offers with average ability?
进程的通信方式
The ktp900f mobile download program of the fail safe mobile panel prompts that the download cannot be performed, and the target device is running or not in the transmission mode
img2pdf
Industrial development status of virtual human
Web security XSS foundation 06
Genesis public chain and a group of encryption investors in the United States gathered in consensus 2022
ThreadLocal local thread
堆內存分配的並發問題