mirror of
https://github.com/chefyuan/algorithm-base.git
synced 2025-08-05 07:11:35 +00:00
验证,校对
This commit is contained in:
@@ -1,5 +1,3 @@
|
||||
|
||||
|
||||
> 如果阅读时,发现错误,或者动画不可以显示的问题可以添加我微信好友 **[tan45du_one](https://raw.githubusercontent.com/tan45du/tan45du.github.io/master/个人微信.15egrcgqd94w.jpg)** ,备注 github + 题目 + 问题 向我反馈
|
||||
>
|
||||
> 感谢支持,该仓库会一直维护,希望对各位有一丢丢帮助。
|
||||
@@ -63,7 +61,6 @@ class Solution {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
C++ Code:
|
||||
@@ -72,18 +69,23 @@ C++ Code:
|
||||
class Solution {
|
||||
public:
|
||||
bool isPalindrome(ListNode* head) {
|
||||
//这里需要用动态数组,因为我们不知道链表的长度
|
||||
vector<int> arr;
|
||||
ListNode* copynode = head;
|
||||
//将链表的值复制到数组中
|
||||
while (copynode) {
|
||||
arr.push_back(copynode->val);
|
||||
copynode = copynode->next;
|
||||
}
|
||||
//双指针遍历数组
|
||||
int back = 0;
|
||||
int pro = arr.size() - 1;
|
||||
while (back < pro) {
|
||||
//判断两个指针的值是否相等
|
||||
if (arr[back] != arr[pro]) {
|
||||
return false;
|
||||
}
|
||||
//移动指针
|
||||
back++;
|
||||
pro--;
|
||||
}
|
||||
@@ -121,7 +123,7 @@ var isPalindrome = function(head) {
|
||||
|
||||
Python Code:
|
||||
|
||||
```py
|
||||
```python
|
||||
class Solution:
|
||||
def isPalindrome(self, head: ListNode) -> bool:
|
||||
arr = []
|
||||
@@ -145,7 +147,7 @@ class Solution:
|
||||
|
||||
这个方法可以直接通过,但是这个方法需要辅助数组,那我们还有其他更好的方法吗?
|
||||
|
||||
双指针翻转链表法
|
||||
**双指针翻转链表法**
|
||||
|
||||
在上个题目中我们知道了如何找到链表的中间节点,那我们可以在找到中间节点之后,对后半部分进行翻转,翻转之后,重新遍历前半部分和后半部分进行判断是否为回文。
|
||||
|
||||
@@ -165,17 +167,17 @@ class Solution {
|
||||
}
|
||||
//找到中间节点,也就是翻转的头节点,这个在昨天的题目中讲到
|
||||
//但是今天和昨天有一些不一样的地方就是,如果有两个中间节点返回第一个,昨天的题目是第二个
|
||||
ListNode midenode = searchmidnode(head);
|
||||
ListNode midnode = searchmidnode(head);
|
||||
//原地翻转链表,需要两个辅助指针。这个也是面试题目,大家可以做一下
|
||||
//这里我们用的是midnode.next需要注意,因为我们找到的是中点,但是我们翻转的是后半部分
|
||||
ListNode backhalf = reverse(midenode.next);
|
||||
ListNode backhalf = reverse(midnode.next);
|
||||
//遍历两部分链表,判断值是否相等
|
||||
ListNode p1 = head;
|
||||
ListNode p2 = backhalf;
|
||||
while (p2 != null) {
|
||||
if (p1.val != p2.val) {
|
||||
//若要还原,记得这里也要reverse
|
||||
midenode.next = reverse(backhalf);
|
||||
midnode.next = reverse(backhalf);
|
||||
return false;
|
||||
}
|
||||
p1 = p1.next;
|
||||
@@ -183,7 +185,7 @@ class Solution {
|
||||
}
|
||||
//还原链表并返回结果,这一步是需要注意的,我们不可以破坏初始结构,我们只是判断是否为回文,
|
||||
//当然如果没有这一步也是可以AC,但是面试的时候题目要求可能会有这一条。
|
||||
midenode.next = reverse(backhalf);
|
||||
midnode.next = reverse(backhalf);
|
||||
return true;
|
||||
}
|
||||
//找到中点
|
||||
@@ -222,17 +224,17 @@ public:
|
||||
}
|
||||
//找到中间节点,也就是翻转的头节点,这个在昨天的题目中讲到
|
||||
//但是今天和昨天有一些不一样的地方就是,如果有两个中间节点返回第一个,昨天的题目是第二个
|
||||
ListNode * midenode = searchmidnode(head);
|
||||
ListNode * midnode = searchmidnode(head);
|
||||
//原地翻转链表,需要两个辅助指针。这个也是面试题目,大家可以做一下
|
||||
//这里我们用的是midnode->next需要注意,因为我们找到的是中点,但是我们翻转的是后半部分
|
||||
ListNode * backhalf = reverse(midenode->next);
|
||||
ListNode * backhalf = reverse(midnode->next);
|
||||
//遍历两部分链表,判断值是否相等
|
||||
ListNode * p1 = head;
|
||||
ListNode * p2 = backhalf;
|
||||
while (p2 != nullptr) {
|
||||
if (p1->val != p2->val) {
|
||||
//若要还原,记得这里也要reverse
|
||||
midenode.next = reverse(backhalf);
|
||||
midnode->next = reverse(backhalf);
|
||||
return false;
|
||||
}
|
||||
p1 = p1->next;
|
||||
@@ -240,7 +242,7 @@ public:
|
||||
}
|
||||
//还原链表并返回结果,这一步是需要注意的,我们不可以破坏初始结构,我们只是判断是否为回文,
|
||||
//当然如果没有这一步也是可以AC,但是面试的时候题目要求可能会有这一条。
|
||||
midenode->next = reverse(backhalf);
|
||||
midnode->next = reverse(backhalf);
|
||||
return true;
|
||||
}
|
||||
//找到中间的部分
|
||||
@@ -277,17 +279,17 @@ var isPalindrome = function(head) {
|
||||
}
|
||||
//找到中间节点,也就是翻转的头节点,这个在昨天的题目中讲到
|
||||
//但是今天和昨天有一些不一样的地方就是,如果有两个中间节点返回第一个,昨天的题目是第二个
|
||||
let midenode = searchmidnode(head);
|
||||
let midnode = searchmidnode(head);
|
||||
//原地翻转链表,需要两个辅助指针。这个也是面试题目,大家可以做一下
|
||||
//这里我们用的是midnode.next需要注意,因为我们找到的是中点,但是我们翻转的是后半部分
|
||||
let backhalf = reverse(midenode.next);
|
||||
let backhalf = reverse(midnode.next);
|
||||
//遍历两部分链表,判断值是否相等
|
||||
let p1 = head;
|
||||
let p2 = backhalf;
|
||||
while (p2 != null) {
|
||||
if (p1.val != p2.val) {
|
||||
//若要还原,记得这里也要reverse
|
||||
midenode.next = reverse(backhalf);
|
||||
midnode.next = reverse(backhalf);
|
||||
return false;
|
||||
}
|
||||
p1 = p1.next;
|
||||
@@ -295,7 +297,7 @@ var isPalindrome = function(head) {
|
||||
}
|
||||
//还原链表并返回结果,这一步是需要注意的,我们不可以破坏初始结构,我们只是判断是否为回文,
|
||||
//当然如果没有这一步也是可以AC,但是面试的时候题目要求可能会有这一条。
|
||||
midenode.next = reverse(backhalf);
|
||||
midnode.next = reverse(backhalf);
|
||||
return true;
|
||||
};
|
||||
|
||||
@@ -326,7 +328,7 @@ var reverse = function(slow) {
|
||||
|
||||
Python Code:
|
||||
|
||||
```py
|
||||
```python
|
||||
class Solution:
|
||||
def isPalindrome(self, head: ListNode) -> bool:
|
||||
if head is None or head.next is None:
|
||||
@@ -344,12 +346,11 @@ class Solution:
|
||||
if p1.val != p2.val:
|
||||
# 若要还原,记得这里也要reverse
|
||||
midnode.next = self.reverse(backhalf)
|
||||
print(head)
|
||||
return False
|
||||
p1 = p1.next
|
||||
p2 = p2.next
|
||||
# 还原链表并返回结果,这一步是需要注意的,我们不可以破坏初始结构,我们只是判断是否为回文,
|
||||
当然如果没有这一步也是可以AC,但是面试的时候题目要求可能会有这一条。
|
||||
# 当然如果没有这一步也是可以AC,但是面试的时候题目要求可能会有这一条。
|
||||
midnode.next = self.reverse(backhalf)
|
||||
return True
|
||||
|
||||
|
Reference in New Issue
Block a user