leetcode+链表+删除链表中的节点

请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。

现有一个链表 -- 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)进行了实现,该方法更加鲁棒

leetcode+链表+删除链表中的节点_第1张图片

2.由于,我们无法访问我们想要删除的节点之前的节点,我们不能修改该节点的next指针。

于是,我们选择将想要删除的节点的值替换为他后面节点中的值,然后删除它之后的节点,不过该方法有bug:

  • 删除的其实不是该节点,而是该节点后面的节点
  • 尾节点后面的节点为null,没有值,无法对尾节点(实则尾节点后的空节点)进行删除

leetcode+链表+删除链表中的节点_第2张图片

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();
	}
}

 

你可能感兴趣的:(LeetCode)