JZ76删除链表中的重复节点
链接:删除链表中重复的结点_牛客题霸_牛客网
参考代码:
自己好像还是偏向双指针这种想法,所以用了两个指针,这样感觉更好理解一些。
对了,去重有两种,我一开始写成了简单的那种,仅仅去重。
这种连重复元素都去掉的更难理解一些。
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } }; */ class Solution { public: ListNode* deleteDuplication(ListNode* pHead) { if(pHead==nullptr || pHead->next==nullptr) { return pHead; } ListNode* L=new ListNode(-1); L->next=pHead; ListNode *pre=L,*slow=L->next,*fast=L->next->next; /* 单纯去重的代码; while(fast!=nullptr&& fast->next!=nullptr) { while(fast!=nullptr && fast->val==slow->val) { fast=fast->next; } slow->next=fast; slow=fast; if(fast!=nullptr) { fast=fast->next; } else { break; } } return pHead; */ //现在是重复的也要去掉 while(slow!=nullptr && slow->next!=nullptr) { if(slow->next->val==slow->val) { int temp=slow->val; while(slow!=nullptr && slow->val==temp) { slow=slow->next; } pre->next=slow; } else { pre=slow; slow=slow->next; } } return L->next; } };
JZ23链表中环的入口节点
链接:链表中环的入口结点_牛客题霸_牛客网
做了好多次了,现在只是条件反射式的会做,但是一时之间公式还是推理不出来。代码随想录链表章节有
这次也还是没写出来。半看了自己之前写的代码,但是思路是正确的。
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } }; */ class Solution { public: ListNode* EntryNodeOfLoop(ListNode* pHead) { ListNode *slow=pHead,*fast=pHead; if(fast==nullptr || fast->next==nullptr) { return nullptr; } while(fast!=nullptr&& fast->next!=nullptr) { slow=slow->next; fast=fast->next->next; if(slow==fast)//代表追寻上了,有环 { ListNode *temp=slow;//相遇节点 slow=pHead; while(temp!=slow) { temp=temp->next; slow=slow->next; } return temp; } } return nullptr; } };
JZ24 反转链表
链接:反转链表_牛客题霸_牛客网
5分钟做了出来。
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* ReverseList(ListNode* pHead) { if(pHead==nullptr || pHead->next==nullptr) { return pHead; } ListNode *slow=nullptr,*fast=pHead; while(fast!=nullptr) { ListNode *temp=fast; fast=fast->next; temp->next=slow; slow=temp; } return slow; } };