Leetcode 203 移除链表元素

Leetcode 203 移除链表元素

        • 准备工作
          • 1)ListNode基本结构
          • 2)初始化ListNode集合
        • 解法一:遍历判定
        • 解法二:递归判定

Leetcode 203 移除链表元素

准备工作
1)ListNode基本结构
public class ListNode {
    public int val;
    public ListNode next;

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

    @Override
    public String toString() {
        ListNode node = this;
        StringBuilder sb = new StringBuilder();
        while (node != null) {
            sb.append(node.val).append("->");
            node = node.next;
        }
        sb.append("NULL");
        return sb.toString();
    }
}
2)初始化ListNode集合
public class ListNodeInit {
    public static ListNode getInitList() {
        ListNode tailf = new ListNode(5, null);
        ListNode node4 = new ListNode(4, tailf);
        ListNode node3 = new ListNode(3, node4);
        ListNode node2 = new ListNode(2, node3);
        return new ListNode(1, node2);
    }
}

解法一:遍历判定

使用两个指针s1、s2来定位链表中的数据,遇到val相等时,就移除对应的节点,否则就依次向后移动节点

class Solution {
	public static void main(String[] args) {
		ListNode initList = ListNodeInit.getInitList();
		System.out.println(initList);
		System.out.println("-----删除后-----");
 		System.out.println(removeElements(initList, 2));
	}


	public static ListNode removeElements(ListNode head, int val) {
        // 构建一个哨兵节点,可以避免后续的空节点、只有一个节点等特殊case
		ListNode node = new ListNode(-1, head);
		ListNode s1 = node;
		ListNode s2 = node.next;

		while (s2 != null) {
			if (s2.val == val) {
				s1.next = s2.next;
			} else {
				s1 = s1.next;
			}
			s2 = s2.next;
		}
		return node.next;
	}
}

解法二:递归判定

递归链表为基础,分别处理val值相等和不相等的情况。

  1. 相等时:即代表我们返回的head数据不包含当前节点,即直接进入next节点的判定
  2. 不相等时:当前节点保留,即head.next的关联关系依然存在,即进行head.next节点的判定,head.next=表示不丢弃当前节点
class Solution {
	public static void main(String[] args) {
		ListNode initList = ListNodeInit.getInitList();
		System.out.println(initList);
		System.out.println("-----删除后-----");
		System.out.println(removeElements(initList, 2));
	}

	public static ListNode removeElements(ListNode head, int val) {
		if (head == null) {
			return null;
		}
		if (head.val == val) {
			// 赋值next则代表移除一个node节点
			return removeElements(head.next, val);
		} else {
			// head.next可以将返回的节点进行关联
			head.next = removeElements(head.next, val);
			return head;
		}
	}
}

你可能感兴趣的:(数据结构与算法,leetcode,链表,算法,leetcode,203)