验证,校对

This commit is contained in:
jaredliw
2021-07-16 00:06:52 +08:00
parent 4a8c81e88e
commit 88fcd88712
14 changed files with 180 additions and 197 deletions

View File

@@ -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