剑指offer面试题18:删除链表的节点;(java实现)

题目一:在O(1)时间内删除链表节点。

给定单向链表的头指针和一个节点指针,定义在一个函数在O(1)时间内删除该节点。链表节点与函数的定义如下:

class ListNode{

int value;

ListNode next;

    ListNode(int value){

    this.value = value;

   }

}

上代码:

public class sortArrayByOddEven {  //需要额外定义一个类ListNode题目有给出
	public static void main(String[] args) {

		ListNode pHead = new ListNode(1);   
		ListNode pAhead = new ListNode(3);
		ListNode pBhead = new ListNode(5);
		ListNode pChead = new ListNode(7);
		pHead.next = pAhead;
		pAhead.next = pBhead;
		pBhead.next = pChead;
		deleteNode(pHead,pBhead);
		while (pHead != null) {
			System.out.print(pHead.value + ",");
			pHead = pHead.next;
		}

	}

	private static void deleteNode(ListNode pHead, ListNode pBhead) {
		if(pHead==null||pBhead==null)  //当头指针为空,或者删除节点为空时
			return ;
		ListNode pNode = pHead;        
		if(pNode.next==null) {            
			while(pNode.next!=pBhead) {
				pNode = pNode.next;
			}
			pNode.next = null;
		}else {               //我们直接让删除节点的值等于删除节点的下一个节点值
             //再将删除节点的next赋值为 deleNode(删除节点).next.next 起到间接删除的效果
                    
			pBhead.value = pBhead.next.value;
			pBhead.next = pBhead.next.next;
		}
	}	
}

分析:对数据进行鲁棒性,安全性检查不再分析;

1)当删除节点.next不存在时:

我们就必须循环所有的节点,知道找出删除节点的上一个节点,来进行删除。

2)当删除节点(deleteNode).next 存在时;

我们只需要将删除节点 的下一个节点替换为删除节点即可;

你可能感兴趣的:(剑指offer)