【面试题】在O(1)时间复杂度删除链表节点
2015-07-28 15:01
323 查看
题目描述
给定一个单链表中的表头和一个等待被删除的节点(非表头或表尾)。请在在O(1)时间复杂度删除该链表节点。并在删除该节点后,返回表头。样例
给定 1->2->3->4,和节点 3,返回 1->2->4。
(372) Delete Node in the Middle of Singly Linked List
http://www.lintcode.com/zh-cn/problem/delete-node-in-the-middle-of-singly-linked-list/
解题思路
删除链表节点,最普通的方法就是遍历链表,复杂度为O(n)O(n)。如果我们把删除节点的下一个结点的值赋值给要删除的结点,然后删除这个结点,这相当于删除了需要删除的那个结点。因为我们很容易获取到删除节点的下一个节点,所以复杂度只需要O(1)O(1),注意题目要求非表头或表尾。
比如样例
1->2->3->4->NULL 删除节点 3 。第一步将节点3的下一个节点的值4赋值给当前节点。变成 1->2->4->4->NULL,然后将就 4 这个结点删除,就达到目的了。 1->2->4->NULL
如果删除的节点的是头节点,把头结点指向NULL。
如果删除的节点的是尾节点,那只能从头遍历到头节点的上一个结点。
代码实现(非表头或表尾)
[code]/** * Definition of ListNode * class ListNode { * public: * int val; * ListNode *next; * ListNode(int val) { * this->val = val; * this->next = NULL; * } * } */ class Solution { public: /** * @param node: a node in the list should be deleted * @return: nothing */ void deleteNode(ListNode *node) { // write your code here if(node == NULL) return; if(node->next != NULL) { ListNode *pNext = node->next; node->val = pNext->val; node->next = pNext->next; delete pNext; pNext = NULL; } } };
代码实现
[code] void deleteNode(ListNode **head, ListNode *node) { // write your code here if(node == NULL) return; if(node->next != NULL) { ListNode *pNext = node->next; node->val = pNext->val; node->next = pNext->next; delete pNext; pNext = NULL; } else if(*head == node) //删除的节点是头节点 { delete node; node = NULL; *head = NULL; } else //删除的是尾节点 { ListNode *pNode = *head; while(pNode->next != node) { pNode = pNode->next; } pNode->next = NULL; delete node; node = NULL; } }
相关文章推荐
- 面试之求找两个数和为某个数、几个连续数等于某个数
- 黑马程序员--类的三大特性(多态、继承、封装)
- 黑马程序员--类与对象
- 黑马程序员--预处理指令、内部和外部函数、递归思想
- 黑马程序员--结构体以及枚举
- 【面试题】删除链表中倒数第n个节点
- 黑马程序员--指针
- 面试题25_二叉树中和为某一值的路径
- 黑马程序员--循环语句
- 【黑马程序员】java的时间操作
- 阿里电话面试
- 黑马程序员----0704期java开发前奏
- 阿里常考面试题及答案
- 【黑马程序员】简略解析 java Scanner中的 next() 方法和 nextLine() 方法
- 黑马程序员--算数运算和运算符
- 数据库常见面试题
- 大众点评面试
- 黑马程序员--变量的内存分析
- (剑指Offer)面试题41:和为s的连续正数序列
- 黑马程序员----0704期java基础班心得