**
只给定单链表中某个结点p,O(1)时间内在p前面插入一个结点。返回头结点。
**
**要询问节点是否一定在链表中(否则判断的时间复杂度为O(n)),是否为空等这些条件。
采用交换值的方法,相当于在该节点后插入节点。
public static ListNode insertNodeBeforeNode(ListNode head, ListNode node, ListNode newNode){
if(newNode==null) return null;
if(head == null && node == null) head = newNode;//链表为空
else if(node == null){//在尾节点插入
ListNode p = head;
for(; p.next != null; p = p.next);
p.next = newNode;
}else{//在中间的结点前(包括头结点)插入
newNode.val ^= node.val;
node.val ^= newNode.val;
newNode.val ^= node.val;
newNode.next = node.next;
node.next = newNode;
}
return head;
}
**
只给定单链表中某个结点p,O(1)时间内删除该结点。返回头结点。
**
**要询问节点是否一定在链表中(否则判断的时间复杂度为O(n)),是否为空等这些条件。
同样采用交换值的方法,相当于删除后一个节点。
时间复杂度:如果删除中间的节点,复杂度为O(1).删除尾结点,复杂度为O(n)。平均复杂度为{(n-1)O(1)+O(n)}/n = O(1)
public static ListNode deleteNode(ListNode head, ListNode node){
if(head == null || node == null) return null;
else if(node.next == null){//删除尾结点
if(node == head) head = null;
else{
ListNode p = head;
for(; p.next != null && p.next.next != null; p = p.next);
p.next = null;
}
}else{//删除中间的结点
node.next.val ^= node.val;
node.val ^= node.next.val;
node.next.val ^= node.val;
node.next = node.next.next;
}
return head;
}