链表和递归

一、Leetcode中与链表向操作

203. 移除链表元素

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

示例:

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

https://leetcode-cn.com/problems/remove-linked-list-elements/

解答:

public class ListNode {

    int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) { this.val = val; }
    ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}

  

removeElements方法。方式1

 public ListNode removeElements(ListNode head, int val){

        //从head开始,删除所有val值相同的元素。
        while (head != null && head.val == val){
            ListNode delNode = head;
            head = head.next;
            delNode.next = null;
        }
        //如果前面已经删完,则返回null
        if(head == null){
            return  null;
        }
        ListNode pre = head;
        //从第2个节点开始遍历所有元素
        while (pre.next != null){
            if(pre.next.val == val){
                ListNode delNode = pre.next;
                pre.next = delNode.next;
                delNode.next = null;
            }else {
                pre = pre.next;
            }
        }

        return  head;
    }

  

方式2:

将方式1改成方式2

 /**
     * 方式2
     */
    public ListNode removeElements2(ListNode head, int val){

        //从head开始,删除所有val值相同的元素。
        while (head != null && head.val == val){

            head = head.next;

        }
        //如果前面已经删完,则返回null
        if(head == null){
            return  null;
        }
        ListNode pre = head;
        //从第2个节点开始遍历所有元素
        while (pre.next != null){
            if(pre.next.val == val){
                pre.next = pre.next.next;
            }else {
                pre = pre.next;
            }
        }

        return  head;
    }

  

方式3 使用虚拟头节点

这样都不用对头结点做特殊处理。

/**
     * 方式3 使用虚拟头节点
     */
    public ListNode removeElements3(ListNode head, int val){

        //创建虚拟头节点
        ListNode dummyHead = new ListNode(-1);
        dummyHead.next = head;

        ListNode pre = dummyHead;
        //从第2个节点开始遍历所有元素
        while (pre.next != null){
            if(pre.next.val == val){
                pre.next = pre.next.next;
            }else {
                pre = pre.next;
            }
        }

        return  dummyHead.next;
    }

  

方式4 使用递归

    /**
     * 方式4 使用递归
     */
    public ListNode removeElements4(ListNode head, int val){

      if(head == null){
          return  null;
      }
      //res 为除了head节点的右边节点。
      ListNode res = removeElements4(head.next, val);
      if(head.val == val){
          return  res;
      }else {
          head.next =res;
          return  head;
      }
    }

  

作者:Work Hard Work Smart
出处:http://www.cnblogs.com/linlf03/
欢迎任何形式的转载,未经作者同意,请保留此段声明!

原文地址:https://www.cnblogs.com/linlf03/p/14396750.html