22、给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。
1、此题对比原题有改动
2、题目保证链表中节点的值互不相同
3、该题只会输出返回的链表和结果做对比,所以若使用C或C++ 语言,你不需要free或delete被删除的节点。
数据范围:
0<=链表节点值<=10000
0<=链表长度<=10000
示例一
输入:
{2,5,1,9},5
返回值:
{2,1,9}
说明:
给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 2->1->9
示例2
输入:
{2,5,1,9},1
返回值:
{2,5,9}
说明:
给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 2->5->9
思路
新建一个节点p,通过 p.next=head将p接到链表最前端组成新链表,遍历链表。
1、当旧头节点的值为给定值时,head=head.next,然后p再重新接到head前,结束遍历。
2、p的下一个节点的值为给定值,通过p.next=p.next.next来删除该节点,结束遍历。
3、遍历下一个节点。
最后返回head。
具体实现(java)
核心代码:
public ListNode removeElements(ListNode head, int val) {
ListNode p=new ListNode(1);
p.next=head;
while(p.next!=null){
if(head.val==val){
head=head.next;
p.next=head;
break;
}else if(p.next.val==val){
p.next=p.next.next;
break;
}else{
p=p.next;
}
}
return head;
}