题目一:在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 存在时;
我们只需要将删除节点 的下一个节点替换为删除节点即可;