题目:
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。
现有一个链表 – head = [4,5,1,9],它可以表示为:
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.
说明:
链表至少包含两个节点。
链表中所有节点的值都是唯一的。
给定的节点为非末尾节点并且一定是链表中的一个有效节点。
不要从你的函数中返回任何结果。
代码:
package leetCode;
/**
* 2018.7.23
* 删除链表中的节点
* @author dhc
*
*/
public class TwoHundredsAndThirtySeven {
public class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
//一开始很懵,就给个删除节点,没链表的头结点咋弄,就加了个头结点,但是人家题目就不给
public static void deleteNode(ListNode head, ListNode node) {
/* ListNode pre = head;
ListNode tem = head;
while(tem!=null) {
if(tem.val == node.val && tem == head) {
head = head.next;
break;
}else if(tem.val == node.val){
pre.next = tem.next;
break;
}else {
pre = tem;
tem = tem.next;
}
}*/
ListNode tem = head;
while(tem != null) {
if(tem.val == node.val) {
tem.val = tem.next.val;
tem.next = tem.next.next;
}
tem = tem.next;
}
}
//大佬答案,但是就这个没有头结点用来找这个节点也不行啊,没法调啊(但是相比于一般需要用一个前置结点变量来说,更好一点的样子)
public static void deleteNode(ListNode node) {
node.val = node.next.val;
node.next = node.next.next;
}
public static void main(String[] args) {
ListNode head = new TwoHundredsAndThirtySeven().new ListNode(4);
ListNode node1 = new TwoHundredsAndThirtySeven().new ListNode(5);
ListNode node2 = new TwoHundredsAndThirtySeven().new ListNode(1);
ListNode node3 = new TwoHundredsAndThirtySeven().new ListNode(9);
head.next = node1;
node1.next = node2;
node2.next = node3;
deleteNode(head,node1);
while(head!=null) {
if(head.next == null) {
System.out.print(head.val);
}else {
System.out.print(head.val+"->");
}
head = head.next;
}
}
}