请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。
现有一个链表 -- head = [4,5,1,9],它可以表示为:
示例 1:
输入: head = [4,5,1,9], node = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
示例 2:
输入: head = [4,5,1,9], node = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
1.拿到题目,第一反应是与下一个节点进行交换,即修改之前节点的next指针,使其指向之后的节点
函数public void deleteNode1(ListNode node)进行了实现,该方法更加鲁棒
2.由于,我们无法访问我们想要删除的节点之前的节点,我们不能修改该节点的next指针。
于是,我们选择将想要删除的节点的值替换为他后面节点中的值,然后删除它之后的节点,不过该方法有bug:
- 删除的其实不是该节点,而是该节点后面的节点
- 尾节点后面的节点为null,没有值,无法对尾节点(实则尾节点后的空节点)进行删除
class ListNode{
public ListNode next;
public int val;
public ListNode(int x) {
this.val=x;
}
}
public class Solution{
public ListNode head;
public int length=0;
//打印链表
public void printLinkList()
{
ListNode p=head;
while(p!=null)
{
System.out.print(p.val+" ");
p=p.next;
}
System.out.println();
System.out.println("长度为:"+length);
}
//删除链表中的结点
public void deleteNode(ListNode node)
{
node.val=node.next.val;
node.next=node.next.next;
}
//尾插法添加结点
public void addLastNode(ListNode x)
{
if(head==null)
{
head=x;
length++;
return;
}
ListNode q=head;
while(q.next!=null)
q=q.next;
q.next=x;
length++;
}
public static void main(String[] args)
{
Solution main=new Solution();
ListNode x1=new ListNode(4);
main.addLastNode(x1);
ListNode x2=new ListNode(5);
main.addLastNode(x2);
ListNode x3=new ListNode(1);
main.addLastNode(x3);
ListNode x4=new ListNode(9);
main.addLastNode(x4);
main.printLinkList();
main.deleteNode(x2);
main.printLinkList();
}
}