删除重复节点
本来今天是想单独看看递归的,由于人太暴躁就继续做了简单的链表题。
2/给定一个排序链表,删除所有重复的元素使其只留其中之一。
这道题让我实实在在有感受到递归的魅力,我真的是太怕递归了,总感觉脑袋转不过那么多次。今天突然发现我把递归次数降下来先验证代码会比较好一些。主要是在另外一道题里面又发现这种递归删除节点的方法,所以在这里也试了一下。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head==nullptr) return nullptr;
if(head->next==nullptr)return head;
//判断第一二个结点是否是空很重要
else if(head->next->val==head->val)
{
head=deleteDuplicates(head->next);
//注意递归调用的head->next是作为head出现在调用的这个函数里的
}
else {
head->next=deleteDuplicates(head->next);
}
return head;
}
};
判断回文
3/由于上一道题尝到递归的甜头,所以回文链表这道题我又尝试用递归。但结果不是那么如人意。主要是这道题的性质并不适合用递归。leetcode给出的结构体就是单链表,但用双链表肯定很方便。救命!所以我看了看官方的解答思路,选择了把链表复制到数组里面去进行判断。不得不说这个方法太菜鸡了,复杂度很高!总之应该是最简单的一种方法了,对于初学者好像蛮友好~要命的是,我连动态数组的定义和使用都忘了TT
/* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
bool isPalindrome(ListNode* head) {
if(head==nullptr)return false;
vector<int>arr;
ListNode*p=head;
int i,j;
while(p)
{
arr.emplace_back(p->val);
p=p->next;
i++;
}
for(i=0,j=(int)arr.size()-1;i<j;i++,j--)
{
if(arr[i]!=arr[j])
return false;
}
return true;
}
};
总结:又是无助的一天5555,明天会好起来吧?双链表爷来啦!