/** * 题目:(在O(1)时间内删除链表节点) * 给定单链表的头指针和节点指针,定义一个函数在O(1)时间内删除节点。 * 解题思路: * 把下一个节点的内容复制到要删除的节点上覆盖原有的内容,再把下一个节点删除。 * 特殊情况: * 1)删除的节点位于链表的尾部,需要从链表的头结点开始,顺序遍历得到该节点的前序节点,并完成删除操作。 * 2)链表中只有一个节点,又要删除链表的头节点(也是尾节点),那么,在删除节点之后,还要把链表的头节点设置为空 * 总的平均时间复杂度:[(n-1)*O(1)+O(n)]/n,结果还是O(1),符合要求。 */ public class P119_DeleteNodeByO1 { public void DeleteNodeByO1(ListNode pListNode,ListNode pToBeDeleted){ //要删除的节点是中间的普通节点 if (pToBeDeleted.next != null) { ListNode temp = pToBeDeleted.next; pToBeDeleted.val = temp.val; pToBeDeleted.next = temp.next; } //链表中只有一个节点,删除头节点(也是尾节点) else if (pToBeDeleted == pListNode) { pListNode = null; } else { while (pListNode.next != pToBeDeleted) { pListNode = pListNode.next; } pListNode.next = null; } } public static void main(String[] args) { ListNode head = new ListNode(1); ListNode node1 = new ListNode(2); ListNode node2 = new ListNode(3); ListNode node3 = new ListNode(4); ListNode node4 = new ListNode(5); head.next = node1; node1.next = node2; node2.next = node3; node3.next = node4; node4.next = null; P119_DeleteNodeByO1 test = new P119_DeleteNodeByO1(); test.DeleteNodeByO1(head,node2); System.out.print(node1.next.val); } }
剑指offer:删除链表的节点---在O(1)时间内删除链表节点
最新推荐文章于 2023-03-30 10:11:59 发布