题目描述
在O(1)时间删除链表结点
代码示例
public class Offer13 {
public static void main(String[] args) {
//构建链表
ListNode head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);
//打印原始链表
Offer13 testObj = new Offer13();
testObj.printList(head);
//删除第二个节点,打印链表
ListNode firstDeleteNode = head.next;
testObj.deleteNode(head, firstDeleteNode);
testObj.printList(head);
//删除最后一个节点,打印链表
ListNode secondDeleteNode = head.next;
testObj.deleteNode(head, secondDeleteNode);
testObj.printList(head);
}
private static class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
}
}
//删除节点
public ListNode deleteNode(ListNode head, ListNode tobeDelete) {
if (head == null || tobeDelete == null) {
return null;
}
if (tobeDelete.next != null) {
//要删除的节点不是尾节点
ListNode next = tobeDelete.next;
tobeDelete.val = next.val;
tobeDelete.next = next.next;
} else {
if (head == tobeDelete) {
head = null;
} else {
ListNode cur = head;
while (cur.next != tobeDelete) {
cur = cur.next;
}
cur.next = null;
}
}
return head;
}
//打印链表
private void printList(ListNode head) {
if (head == null) {
return;
}
while (head != null) {
System.out.print(head.val + " ");
head = head.next;
}
System.out.println();
}
}