最近在找实习工作,做个左神算法的学习日记,方便以后鄙视自己。
题一:
判断一个链表是否为回文结构
【题目】
给定一个链表的头节点head, 请判断该链表是否为回文结构。
例如:
1->2->1, 返回true。
1->2->2->1, 返回true。
15->6->15, 返回true。
1->2->3, 返回false。
进阶:
如果链表长度为N, 时间复杂度达到O(N), 额外空间复杂度达到O(1)。
我只是写日记,感兴趣的同学可以去看左神的书和视频
#include<iostream>
#include<string>
#include<vector>
#include<list>
using namespace std;
class node//结点类
{
public:
int num;
node *next;
node()
{
num = 0;
next = NULL;
}
};
class List//链表类,包含每个链表的头尾结点,实现了从末尾插入的insert,
{
public:
node *head;
node *end;
List()
{
head = NULL;
end = NULL;
}
void insert(int dum)
{
node *n = new node();
n->num = dum;
if (!head)
{
head = n;
end = n;
}
else
{
n->next = end->next;
end->next = n;
end = n;
}
}
~List()//第一次实现析构链表,还挺难
{
node *dum = head;
node *beh = nullptr;
while (dum)
{
beh = dum->next;
delete dum;
dum = beh;
}
}
};
int main()
{
List l;
for (int i = 0; i < 5; i++)
{
int dum;
cin >> dum;
l.insert(dum);
}
node *fast = l.head, *mid = l.head;
while (fast != l.end && fast->next != l.end)
{
mid = mid->next;
fast = fast->next->next;
}
//中点以后实现指针翻转
node *dum = mid->next;
mid->next = nullptr;
node *n = nullptr;
while (dum)
{
n = dum->next;
dum->next = mid;
mid = dum;
dum = n;
}
//判断是否是回文
node *begin = l.head;
node *end = l.end;
int a = 1;
while (end)
{
if (begin->num != end->num)
{
a = 0;
break;
}
begin = begin->next;
end = end->next;
}
//将链表恢复原样
mid = l.end;
dum = mid->next;
mid->next = NULL;
while (dum)
{
n = dum->next;
dum->next = mid;
mid = dum;
dum = n;
}
cout << a;
}