面试题 02.03. 删除中间节点

题目描述:

实现一种算法,删除单向链表中间的某个节点(即不是第一个或最后一个节点),假定你只能访问该节点。

 

示例:

输入:单向链表a->b->c->d->e->f中的节点c
结果:不返回任何数据,但该链表变为a->b->d->e->f

思路:

因为给的不是头结点,而是要删除的节点

我的想法是首先创建一个节点去遍历链表,因为链表不是数组,无法用o(1)的时间复杂度去获取当前元素

遍历过程中去对比当前遍历到元素的值与Node节点值是否一致,然后再进行正常的删除操作

但是这样会存在一个问题就是

创建的节点无法指向

所以最正确的做法就是直接保存node 节点的next节点然后让Node节点指向node的next next

这样就达到了删除的目的

不仅要保存指针还要保存元素的值

代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
void deleteNode(struct ListNode* node) {
   struct ListNode *temp=node->next;
   node->val=node->next->val;
   node->next=node->next->next;
   free(temp);
}

  

posted @ 2020-08-24 22:36  进寸欢喜  阅读(119)  评论(0编辑  收藏  举报