题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。
方法:
1. 一般的方法,都是找到要删除节点的前一个节点,但是这是单链表,所以只好从链表的头结点开始顺序查找。
2. 改进的方法,可以很方便的找到要删除的节点的下一个节点。
如果把下一个节点的内容复制到需要删除的节点,再把下一个节点删除,就相当于删除了需要删除的节点。
需要注意的是:如果要删除的是最后一个节点,那么, 还是需要顺序查找,然后删除。
如果链表只有一个节点,而又要删除链表的头结点,此时,在删除节点后,还需要把链表的头结点设置为NULL。
Java代码:
1 package com.hb.jzoffer; 2 3 import offer.utilities.ListNode; 4 5 //面试题13:在O(1)时间删除链表结点 6 public class DeleteNodeInList { 7 8 public ListNode DeleteNode(ListNode head , ListNode pToDeleted){ 9 10 ListNode p = head; 11 12 if(p == null || pToDeleted == null){ 13 return null; 14 } 15 16 //要删除的节点不是尾节点 17 if(pToDeleted.getNext() != null){ 18 ListNode pNext = pToDeleted.getNext(); 19 pToDeleted.setData(pNext.getData()); 20 pToDeleted.setNext(pNext.getNext()); 21 22 }else if(p == pToDeleted){ 23 //链表只有一个节点,删除头结点(也是尾节点) 24 p = null; 25 }else{ 26 //链表中有多个节点,删除尾节点 ,这时要循环 27 ListNode pNode = head ; 28 while(pNode.getNext() != pToDeleted){ 29 pNode = pNode.getNext(); 30 } 31 pNode.setNext(null); 32 } 33 return p; 34 } 35 36 37 public static void main(String[] args) throws Exception { 38 ListNode node1 = new ListNode("1" , null); 39 ListNode node2 = new ListNode("2" , null); 40 ListNode node3 = new ListNode("3" , null); 41 ListNode node4 = new ListNode("4" , null); 42 ListNode node5 = new ListNode("5" , null); 43 44 ListNode.connectListNodes(node1, node2); 45 ListNode.connectListNodes(node2, node3); 46 ListNode.connectListNodes(node3, node4); 47 ListNode.connectListNodes(node4, node5); 48 49 System.out.println("初始化链表:"); 50 ListNode.PrintList(node1); 51 52 DeleteNodeInList delete = new DeleteNodeInList(); 53 ListNode Delete_head = delete.DeleteNode(node1, node3); 54 55 System.out.println("删除一个节点后的链表:"); 56 ListNode.PrintList(Delete_head); 57 58 59 } 60 61 62 }