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