在O(1)时间删除链表结点
题目描述:
给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。
具体实现
**解题思路:**要删除这个结点i,可以复制这个结点i的下个结点j的内容到i上,然后把i结点的next指针指向j的下一个结点,再把j结点删除,这样就可以实现删除之前i结点了
public class Shanchu_jiedian {
static class ListNode{
int Value;
ListNode next;
public ListNode(int Value) {
// TODO Auto-generated constructor stub
this.Value = Value;
}
public ListNode(int Value, ListNode next) {
// TODO Auto-generated constructor stub
this.Value = Value;
this.next = next;
}
public ListNode() {
// TODO Auto-generated constructor stub
}
};
public static void DeleteNode(ListNode headnode, ListNode deletenode) {
if(headnode == null || deletenode == null)
return;
if(deletenode.next != null) {//要删除的结点不是尾结点
ListNode nextnode = deletenode.next;
deletenode.Value = nextnode.Value;
deletenode.next = nextnode.next;
}else if(headnode == deletenode) {//链表只有一个结点,删除头结点(也是尾结点)
headnode = null;
deletenode = null;
}else {//链表有多个结点,删除结点是尾结点
ListNode temp = headnode;
while(temp.next != deletenode) {
temp = temp.next;
}
temp.next = null;
deletenode = null;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//node4->node3->node2->node1
ListNode node1 = new ListNode(11);
ListNode node2 = new ListNode(2,node1);
ListNode node3 = new ListNode(3,node2);
ListNode node4 = new ListNode(4,node3);
System.out.println(node1 + " " +node1.Value + " " + node1.next);
System.out.println(node2 + " " +node2.Value + " " + node2.next);
System.out.println(node3 + " " +node3.Value + " " + node3.next);
System.out.println(node4 + " " +node4.Value + " " + node4.next);
System.out.println();
DeleteNode(node4,node3);
System.out.println(node1 + " " +node1.Value + " " + node1.next);
System.out.println(node2 + " " +node2.Value + " " + node2.next);
System.out.println(node3 + " " +node3.Value + " " + node3.next);
System.out.println(node4 + " " +node4.Value + " " + node4.next);
}
}