[蓝蓝计算机考研算法训练二期]-day16

106 阅读1分钟

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