【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;    }};


原创粉丝点击