数据结构与算法_剑指Offer13_在O(1)时间删除链表结点_JAVA实现

今天风好大,大的吓人,可能这就是家乡风的脾气吧 2020.04.21

题目:

在这里插入图片描述
点击链接

解题思路:

删除节点存在三种可能,和一种为了代码健壮的可能(即传入null值)
第一种:删除头结点,即返回头结点的下一个引用为头结点
第二种:删除尾节点,即让指向为节点的指针为空
第三种:删除中间节点,删除节点复制下一个节点内容,再指向下下个节点

package offer13;

class Node {
	int value;
	Node next = null;
	
	public Node(int value) {
		this.value = value;
	}
	public Node() {
	}
}

class LinkedList {
	Node rootNode = null;
	
	public boolean insert(Node newNode) {
		if(rootNode == null) {
			rootNode = newNode;
			return true;
		}
		Node currentNode = rootNode;
		while(currentNode!=null) {
			if(currentNode.next == null) {
				currentNode.next = newNode;
				return true;
			}
			currentNode = currentNode.next;
		}
		return false;
	}

	public void order() {
		Node currentNode  = rootNode;
		while(currentNode != null) {
			System.out.println("\t" + currentNode.value);
			currentNode = currentNode.next;			
		}
	}
	/**
	 * @param headNode 头结点
	 * @param isDeleteNode 删除节点
	 * @return 头结点
	 */
	public Node deleteNode(Node headNode , Node isDeleteNode) {
		if(headNode  == null || isDeleteNode == null) {
			return headNode;
		}
		if(headNode == isDeleteNode) {//删除头节点
			headNode = headNode.next;
			return headNode;
		}
		if(isDeleteNode.next == null) {//删除尾节点
			Node currentNode = headNode;
			while (currentNode.next != isDeleteNode) {
				currentNode = currentNode.next;
			}
			currentNode.next = null;
		}else {//删除中间节点
			isDeleteNode.value = isDeleteNode.next.value;
			isDeleteNode.next = isDeleteNode.next.next;
		}	
		return rootNode;
	}
}


public class DeleteLinkedNode {
    public static void main(String[] args) {
    	LinkedList linkedList = new LinkedList();
    	Node head = new Node(1);
    	linkedList.insert(head);
    	linkedList.insert(new Node(2));
    	linkedList.insert(new Node(3));
    	Node middle = new Node(4);
    	linkedList.insert(middle);
    	linkedList.insert(new Node(5));
    	Node last = new Node(6);
    	linkedList.insert(last);
    	
    	linkedList.order();
    	System.out.println();
    	linkedList.rootNode = linkedList.deleteNode(linkedList.rootNode, null);//删除参数为空
    	linkedList.order();
    	System.out.println();
    	linkedList.rootNode = linkedList.deleteNode(linkedList.rootNode, head);//删除头结点
    	linkedList.order();
    	System.out.println();
    	linkedList.rootNode = linkedList.deleteNode(linkedList.rootNode, middle);//删除中间结点
    	linkedList.order();
    	System.out.println();
    	linkedList.rootNode = linkedList.deleteNode(linkedList.rootNode, last);//删除尾结点
    	linkedList.order();
    	System.out.println();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值