一、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;
}
}