题目
在O(1)时间内删除链表节点。
解题思路
删除链表的两种方法:
1、在删除节点 i 之前,先从链表的头节点开始遍历到i前面的一个节点 h ,把 h 的 next指针 指向i的下一个节点 j ,再删除i。
2、把节点 j 的内容复制覆盖节点 i, 接下来再把节点 i 的next指针指向 j 的下一个节点,再删除节点 j。
测试用例
1、特殊测试
指向链表头节点的为nullptr节点;
指向要删除节点的为nullptr指
2、功能测试
从有多个链表的节点中间删除一个节点;
从有多个节点的链表中删除头节点;
从只有一个节点的链表中删除节点。
代码
package swordOffer;
import java.awt.List;
public class deleteNode {
public static class ListNode{
int data;
ListNode next = null;
public ListNode() {}
public ListNode(int data, ListNode next) {
this.data = data;
this.next = next;
}
}
public static void deleteNode(ListNode pHead, ListNode pDelNode) {
if(pHead == null || pDelNode == null) {
return;
}
if(pDelNode != null) {//要删除的节点不是尾节点
ListNode pNext = pDelNode.next;
pDelNode.data = pNext.data;
pDelNode.next = pNext.next;
}else if(pHead == pDelNode) {//
pHead = null;
pDelNode = null;
}else {//链表中有多个节点,删除尾节点
ListNode pNode = pHead;
while(pNode.next != pDelNode) {
pNode = pNode.next;
}
pNode.next = null;
}
}
public static void main(String[] args) {
ListNode node4 = new ListNode(4, null);
ListNode node3 = new ListNode(3, node4);
ListNode node2 = new ListNode(2, node3);
ListNode head = new ListNode(1, node2);
deleteNode(head, node2);
while(head != null) {
System.out.print(head.data + " ");
head= head.next;
}
}
}
总结
1、复习链表
2、时间复杂度是:
对于n-1个非尾部结点而言删除的时间复杂度为O(1),对于尾部结点删除而言,仍然需要O(n)的时间复杂度。但是平均时间复杂度是:[ ( n - 1 ) * O( 1 ) + O( n ) ] / n,结果还是O(1)。