美文网首页
链表练习--力扣(LeeCode:编号203)

链表练习--力扣(LeeCode:编号203)

作者: 二妹是只猫 | 来源:发表于2019-08-28 16:12 被阅读0次

在上篇了解了链表,在来看看力扣(LeeCode)上一个关于链表的练习:

删除链表中等于给定值 val 的所有节点。

示例:

输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5

原答题框架:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode removeElements(ListNode head, int val) {
    }
}

普通解答:

class Solution {

    public ListNode removeElements(ListNode head, int val) {

        while(head != null && head.val == val){
            ListNode delNode = head;
            head = head.next;
            delNode.next = null;
        }

        if(head == null)
            return head;

        ListNode prev = head;
        while(prev.next != null){
            if(prev.next.val == val) {
                ListNode delNode = prev.next;
                prev.next = delNode.next;
                delNode.next = null;
            }
            else
                prev = prev.next;
        }

        return head;
    }
  • 首先使用循环去除链表头为val的情况
  • 在使用循环去除后面节点为val的情况

使用虚拟节点解答:

class Solution3 {

    public ListNode removeElements(ListNode head, int val) {

        ListNode dummyHead = new ListNode(-1);
        dummyHead.next = head;

        ListNode prev = dummyHead;
        while(prev.next != null){
            if(prev.next.val == val)
                prev.next = prev.next.next;
            else
                prev = prev.next;
        }

        return dummyHead.next;
    }
}
  • 开头设置虚拟节点其值无意义随便设置了一个-1,由此避免了上一个解答方案中关于头结点的循环判断.

递归解答:

class Solution {

    public ListNode removeElements(ListNode head, int val) {

        if(head == null)
            return head;

        head.next = removeElements(head.next, val);
        return head.val == val ? head.next : head;
    }
}

相关文章

网友评论

      本文标题:链表练习--力扣(LeeCode:编号203)

      本文链接:https://www.haomeiwen.com/subject/ehtmectx.html