【Linked-list专题-2】237. Delete Node in a Linked List 206. Reverse Linked List
来源:互联网 发布:淘宝订单编号有规律吗 编辑:程序博客网 时间:2024/05/21 11:10
237. Delete Node in a Linked List
这题第一眼一看,很简单嘛。这不是一个基础操作吗,结果一看给的函数,参数是给到要删除的那个结点。
处于惯性思维,觉得删除一个结点的操作是 pre->next = pre->next->next,于是一直想着一个单链表怎么去取到前一个结点。。。。
后来才恍然大悟,直接把这个结点变成跟下一个结点一样的,然后把指针指向下下个结点不也是一种思路吗!
警惕惯性思维钻进死胡同
class Solution {public: void deleteNode(ListNode* node) { node->val = node->next->val; node->next = node->next->next; }};
206. Reverse Linked List
也是属于基础操作了,虽然没认真去实现过,不过画个图还是挺清楚的,这题倒没出什么问题了
class Solution {public: ListNode* reverseList(ListNode* head) { if(head == NULL) return head; ListNode* prenode = head; while(head->next){ ListNode* nextnode = head->next; head->next = head->next->next; nextnode->next = prenode; prenode = nextnode; } return prenode; }};
234. Palindrome Linked List
这题粗略一看,觉得反转对比一下不就OK了吗!结果出现第一个问题:上题所写的链表反转函数,其实是会改变原链表的结构的,所以再想对原链表进行比较是不可行的了。于是想到用一个vector之类的东西存好原链表的值,但是题目明确要求O(1)的空间复杂度。
最后没想出什么比较好的思路,参考了讨论区的代码。思路是保留前半串,反转后半串进行比较,还是比较巧妙的
至于取半串的做法,就是用一个一步走指针和两步走指针进行同步前进,当两步走到尽头时,一步走就到中间位置了。
class Solution {public: ListNode* reverseList(ListNode* head) { if(head == NULL) return head; ListNode* prenode = head; while(head->next){ ListNode* nextnode = head->next; head->next = head->next->next; nextnode->next = prenode; prenode = nextnode; } return prenode; } bool isPalindrome(ListNode* head) { if(head == NULL) return true; ListNode* nextNode = head; ListNode* doubleNext = head; while(nextNode->next && doubleNext->next && doubleNext->next->next){ //注意必须先判断doubleNext->next nextNode = nextNode->next; doubleNext = doubleNext->next->next; } ListNode* revhead = reverseList(nextNode->next); nextNode->next = revhead; while(revhead && head){ if(revhead->val != head->val) return false; revhead = revhead->next; head = head->next; } return true; }};
阅读全文
0 0
- 【Linked-list专题-2】237. Delete Node in a Linked List 206. Reverse Linked List
- 237.Delete Node in a Linked List
- 237. Delete Node in a Linked List
- 237. Delete Node in a Linked List
- 237. Delete Node in a Linked List
- 237. Delete Node in a Linked List
- 237. Delete Node in a Linked List
- 237. Delete Node in a Linked List
- 237. Delete Node in a Linked List
- 237. Delete Node in a Linked List
- 237. Delete Node in a Linked List
- 237. Delete Node in a Linked List
- 237. Delete Node in a Linked List
- 237. Delete Node in a Linked List
- 237. Delete Node in a Linked List
- 237. Delete Node in a Linked List
- 237. Delete Node in a Linked List
- 237. Delete Node in a Linked List
- 17102001_systemd的运行级别与服务管理命令简介
- js的一些零碎知识点
- iOS面试-第一节
- 模式识别分类器评价指标之ROC曲线
- Spring Boot报错Whitelabel Error Page
- 【Linked-list专题-2】237. Delete Node in a Linked List 206. Reverse Linked List
- 把书读薄:大型网站技术架构-核心原理与案例分析(第二篇 架构)
- 几种网络通信协议
- 一个简单的json对象和json字符串互相转换的方法
- linux笔记
- Nginx的nginx.conf配置文件中文注释说明
- linq的模糊查询和分页
- springboot项目发布到tomcat容器
- java int类型转byte数组