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

删除链表结点注意保证链表不会断开。删除的节点是尾结点时,并不能保证是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();
	}
}
/*output
9 8 7 6 5 4 3 2 1 0 
Delete first node
8 7 6 5 4 3 2 1 0 
Delete node
8 7 6 5 4 2 1 0 
Delete last node
8 7 6 5 4 2 1 */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值