1.在O(1)时间下删除节点
题目:给定链表的头指针和一个节点指针,在O(1)时间删除该节点。
分析:用要删除节点的下一个节点的数据覆盖要删除节点的数据,然后删除下一个节点。此方法不能用来删除尾节点。
代码:
class Solution{
public static void deleteNode(ListNode head, ListNode deleteNode){
//传入的两个节点不能为null
if(head == null || deleteNode == null){
return;
}
//要删除的节点是头节点
if(head == deleteNode){
head = head.next;//更新头部
deleteNode.next == null;//删除
}else if(deleteNode.next != null){//要删除的节点不是尾节点
deleteNode.data = deleteNode.next.data;//修改数据
deleteNode.next = deleteNode.next.next;//删除节点
}else{//要删除的节点是尾节点
ListNode cur = head;
while(cur.next != deleteNode){
cur = cur.next;
}
cur.next = null; //删除
}
}
}
2.单链表的反转
题目:反转一个单链表。
2.1 循环法:
分析:三个临时变量pre、head、next,循环一遍链表,改变链表每个节点的指向。如下所示: