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;}@Overridepublic 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) {// 构建一个哨兵节点,可以避免后续的空节点、只有一个节点等特殊caseListNode 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值相等和不相等的情况。
- 相等时:即代表我们返回的head数据不包含当前节点,即直接进入next节点的判定
- 不相等时:当前节点保留,即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;}}
}