链表专题更新cpp代码

This commit is contained in:
3119005212
2021-04-28 18:28:00 +08:00
parent 6d96954aa7
commit afd452aeda
15 changed files with 627 additions and 12 deletions

View File

@@ -33,6 +33,8 @@
我们首先将链表的所有元素都保存在数组中然后再利用双指针遍历数组进而来判断是否为回文这个方法很容易理解而且代码实现也比较简单
**题目代码**
```java
class Solution {
public boolean isPalindrome(ListNode head) {
@@ -72,6 +74,10 @@ class Solution {
![翻转链表部分](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/photo/翻转链表部分.1v2ncl72ligw.gif)
#### **题目代码**
Java Code
```java
class Solution {
public boolean isPalindrome(ListNode head) {
@@ -129,3 +135,63 @@ class Solution {
}
```
C++ Code
```cpp
class Solution {
public:
bool isPalindrome(ListNode* head) {
if (head == nullptr || head->next == nullptr) {
return true;
}
//找到中间节点,也就是翻转的头节点,这个在昨天的题目中讲到
//但是今天和昨天有一些不一样的地方就是,如果有两个中间节点返回第一个,昨天的题目是第二个
ListNode * midenode = searchmidnode(head);
//原地翻转链表,需要两个辅助指针。这个也是面试题目,大家可以做一下
//这里我们用的是midnode->next需要注意因为我们找到的是中点但是我们翻转的是后半部分
ListNode * backhalf = reverse(midenode->next);
//遍历两部分链表,判断值是否相等
ListNode * p1 = head;
ListNode * p2 = backhalf;
while (p2 != nullptr) {
if (p1->val != p2->val) {
return false;
}
p1 = p1->next;
p2 = p2->next;
}
// 还原链表并返回结果,这一步是需要注意的,我们不可以破坏初始结构,我们只是判断是否为回文,
//当然如果没有这一步也是可以AC但是面试的时候题目要求可能会有这一条。
midenode->next = reverse(backhalf);
return true;
}
//找到中间的部分
ListNode * searchmidnode (ListNode * head) {
ListNode * fast = new ListNode(-1);
ListNode * slow = new ListNode(-1);
fast = head;
slow = head;
//找到中点
while (fast->next != nullptr && fast->next->next != nullptr) {
fast = fast->next->next;
slow = slow->next;
}
return slow;
}
//翻转链表
ListNode * reverse (ListNode * slow) {
ListNode * low = nullptr;
ListNode * temp = nullptr;
//翻转链表
while (slow != nullptr) {
temp = slow->next;
slow->next = low;
low = slow;
slow = temp;
}
return low;
}
};
```