题目:
在O(1)时间内删除链表节点
思路:
/*如果题目要求为O(n)则遍历就可以
* 但是题目要求是O(1)所以只能一次查询就完成
* 直接将后一个元素的值赋予前一个,改变指针时间复杂度就为1
* 但是如果删除元素为末尾就是O(n)
* 我们知道要删除的节点是谁就知道下一个节点,所以
* 1.将下一个节点的数据赋予要删除的节点
* 2.将删除节点的指向改为下下节点,就相当于删除了一个节点,
* 所以平均的时间复杂度为:(O(1) * (n-1) + O(n))/n = O(1);
* 仍然为O(1).
* */
public class offer13_two {
// 定义链表
public class ListNode {
int data;
ListNode nextNode;
ListNode(int x) { data = x; }
}
public void deleteNode (ListNode head, ListNode deListNode){
//链表为空,删除的链表为头部
if(head == null || deListNode == null){
return;
}
if (deListNode == head){
head = null;
}else {
//如果删除的链表为尾部
if(deListNode.nextNode == null){
//遍历找到删除节点,提前更换上一个节点的指针
ListNode newHead = head;
while (newHead.nextNode.nextNode != null){
newHead = newHead.nextNode;
}
newHead.nextNode = null;
}else {
deListNode.data = deListNode.nextNode.data;
deListNode.nextNode = deListNode.nextNode.nextNode;
}
}
}
刷算法刚开始很难,看一道题要好几个小时,但是大家一定坚持,我就不信还有程序员学不会的东西???