版权声明:本文为匆忙拥挤repeat(stone)原创文章,转载请注明出处 —— http://blog.csdn.net/jjwwmlp456 https://blog.csdn.net/jjwwmlp456/article/details/85258151
问题
删除链表中等于给定值 val 的所有节点。
示例:
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5
给定的 ListNode:
public static class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(val + "->");
ListNode p = next;
while (p != null) {
sb.append(p.val + "->");
p = p.next;
}
return sb.toString();
}
}
解一
直接遍历,先处理头节点,再处理非头节点
public static ListNode removeElements(ListNode head, int val) {
//头结点相匹配 删除
while (head != null && head.val == val) {
// ListNode delNode = head;
head = head.next;
// delNode = null; //方法体执行完后,java 有自己的垃圾回收机制;可以不处理
}
if (head == null) {
return null;
}
//非头结点
ListNode p = head;
while (p.next != null) {
if (p.next.val == val) {
// ListNode delNode = p.next;
// p.next = delNode.next;
// delNode = null; //方法体执行完后,java 有自己的垃圾回收机制;可以不处理
p.next = p.next.next;
} else {
p = p.next;
}
}
return head;
}
解二
使用虚拟头结点; 不需要对头结点做处理
public static ListNode removeElements2(ListNode head, int val) {
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head;
ListNode p = dummyHead;
while (p.next != null) {
if (p.next.val == val) {
p.next = p.next.next;
} else {
p = p.next;
}
}
return dummyHead.next;
}
解三
使用递归。
public static ListNode removeElements3(ListNode head, int val) {
if (head == null) return null;
if (head.val == val) {//处理头结点
head = head.next;
head = removeElements3(head, val);
} else {//处理非头结点
if (head.next != null)
head.next = removeElements3(head.next, val);
}
return head;
}
解四
与解三类似。递归中直接处理下个结点,最后才处理头结点
public static ListNode removeElements4(ListNode head, int val) {
if (head == null) return null;
// ListNode result = removeElements4(head.next, val);
// if (head.val == val) {
// return result;
// } else {
// head.next = result;
// return head;
// }
head.next = removeElements4(head.next, val);
if (head.val == val) {
head = head.next;
}
return head;
}