在O(1)时间删除链表结点

来源:互联网 发布:凹凸视频大软件 编辑:程序博客网 时间:2024/04/30 07:21

删除链表结点注意保证链表不会断开。删除的节点是尾结点时,并不能保证是O(1)时间。但平均下来时间复杂度仍然保持在O(1)。

public class List{class Node{int data;Node next;}int N;Node first;boolean isEmpty() { return first==null; };int size() { return N; }public void insert(int val){Node oldfirstNode=first;first=new Node();first.data=val;first.next=oldfirstNode;N++;}public Node FindNodeByVal(int val){Node pNode=first;while(pNode.data!=val){pNode=pNode.next;}return pNode;}public Node FindPrev(Node target){if(first==null || target==null) return null;Node pNode=first;while(pNode.next!=target){pNode=pNode.next;}return pNode;}public void deleteNode(Node toBeDelete){if( first==null || toBeDelete==null) return;//如果要删除的结点不是尾结点if(toBeDelete.next!=null && first!=toBeDelete){System.out.println("Delete node");Node nextNode=toBeDelete.next;toBeDelete.data=nextNode.data;toBeDelete.next=nextNode.next;nextNode=null;}else if(first==toBeDelete){System.out.println("Delete first node");if(first.next==null) {first=null;}else first=first.next;toBeDelete=null;}//要删除的结点是尾结点else{System.out.println("Delete last node");Node pNode=FindPrev(toBeDelete);pNode.next=null;toBeDelete=null;}}public void Print(){Node pNode=first;while(pNode!=null){System.out.print(pNode.data+" ");pNode=pNode.next;}System.out.println();}public static void main(String[] args){List list=new List();for(int i=0;i<10;i++){list.insert(i);}list.Print();Node delNode1=list.FindNodeByVal(9);list.deleteNode(delNode1);list.Print();Node delNode2=list.FindNodeByVal(3);list.deleteNode(delNode2);list.Print();Node delNode3=list.FindNodeByVal(0);list.deleteNode(delNode3);list.Print();}}/*output9 8 7 6 5 4 3 2 1 0 Delete first node8 7 6 5 4 3 2 1 0 Delete node8 7 6 5 4 2 1 0 Delete last node8 7 6 5 4 2 1 */

0 0