美文网首页
Algorithm LeetCode 237 + LeetCod

Algorithm LeetCode 237 + LeetCod

作者: 码农在途 | 来源:发表于2018-12-09 12:26 被阅读0次

    Algorithm 第五周

    LeetCode 237. 删除链表中的节点

    题目链接 解题语言 : C

    请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。
    现有一个链表 -- head = [4,5,1,9],它可以表示为:

    4 -> 5 -> 1 -> 9

    示例 1:
    输入: head = [4,5,1,9], node = 5
    输出: [4,1,9]
    解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.

    示例 2:
    输入: head = [4,5,1,9], node = 1
    输出: [4,5,9]
    解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.

    解题思路 : 其实就是该结点中的值等于下一结点中的值,重要的是结点中指针指向从下一结点变成了下下个结点
    而社区中的答案 ( 注释部分 ) 其实是对指针的理解 , 结点也是指针 , 直接 * ( p )=*(p->next) 其实就是将下一结点中的 数据复制给 p 覆盖 p 结点中原有的数据 , 从而达到删除结点的效果 。
    结果虽然一致 , 但是代表的是对指针这一块知识的不同程度理解 , 有待加强 。

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     struct ListNode *next;
     * };
     */
    void deleteNode(struct ListNode* node) {
        //*node = *(node->next); 官方社区里别人写的答案,让我有了新的认识
        node->val=(node->next)->val;
        node->next=(node->next)->next;
    }
    

    LeetCode 206. 反转链表

    题目链接 解题语言 : C

    反转一个单链表。

    示例:
    输入: 1->2->3->4->5->NULL
    输出: 5->4->3->2->1->NULL

    解题思路 : 这道题的核心是三个结点的设立,一个为中间结点 (代码中的 new_head),一个是上一结点 (代码中的 node) , 以及下一结点 ( head ),将原链表的中间结点指向上一结点即完成链表的反转

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     struct ListNode *next;
     * };
     */
    struct ListNode* reverseList(struct ListNode* head) {
        struct ListNode* new_head=NULL,*node=NULL;
        while (head!=NULL)
        {
            new_head = head;//新的头结点等于当前结点
            head = head->next;//当前结点变成下一结点
            new_head->next = node;//当前结点的下一结点为上一结点,从空指针开始
            node = new_head;//上一节点变成当前结点,以此循环,达到链表反转的效果
        }
        return new_head;
    }
    

    相关文章

      网友评论

          本文标题:Algorithm LeetCode 237 + LeetCod

          本文链接:https://www.haomeiwen.com/subject/nfihhqtx.html