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