常见的链表题有:
1.翻转单向链表 LeetCode 第206
2.判断一个链表是否是回文结构 LeetCode第234题
3.将单向链表按某值划分成左边小,中间相等,右边大的形式
4.复制含有随机指针结点的链表 LeetCode 剑指offer 35
5.两个链表相交问题(存在环) 不存在环的版本为LeetCode 第160(面试题)
6.删除链表中倒数第N个结点
#include<iostream>
#include<list>
#include<stack>
#include<unordered_map>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode* random;
ListNode() : val(0), next(nullptr) {
}
ListNode(int x) : val(x), next(nullptr) {
}
ListNode(int x, ListNode *next) : val(x), next(next) {
}
};
//1.翻转单向链表 LeetCode 第206
//2.判断一个链表是否是回文结构 LeetCode第234题
//3.将单向链表按某值划分成左边小,中间相等,右边大的形式
//4.复制含有随机指针结点的链表 LeetCode 剑指offer 35
//5.两个链表相交问题(存在环),,不存在环的版本为LeetCode 第160(面试题)
//6.删除链表的倒数第N个结点
//1.翻转单向链表 LeetCode 第206
ListNode* reverseList(ListNode* head)
{
ListNode*prev = nullptr;
while (head != nullptr)
{
ListNode*next = head->next;
head->next = prev;
prev = head;
head = next;
}
return prev;
}
//2.判断一个链表是否是回文结构 LeetCode第234题
//利用栈进行判断空间复杂度为O(N),利用快慢指针可以降低空间复杂度
//利用栈
bool isPalindrome(ListNode* head)
{
ListNode*curr = head;
stack<int>stc;
while (curr != NULL)
{
stc.push(curr->val);
curr = curr->next;
}
while (head != NULL)
{
if (head->val = stc.top)
{
return false;
}
stc.pop();
head = head->next;
}
return true;
}
//利用快慢指针
bool isPalindrome(ListNode* head)
{
ListNode*p1 = head;
ListNode*p2 = head;
while (p2->next != NULL&&p2->next->next != NULL)
{
p1 = p1->next;
p2 = p2->next->next;
}
p2 = p1->next;
p1->next = NULL