失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > leetcode 203. 移除链表元素

leetcode 203. 移除链表元素

时间:2019-01-04 10:23:56

相关推荐

leetcode 203. 移除链表元素

题目

思路

经典的小弟大哥解法:

小弟踩着大哥的脚印大哥先走一步

题解

// Definition for singly-linked list.class ListNode {int val;ListNode next;ListNode(int x) {val = x;}}class Solution {public ListNode removeElements(ListNode head, int val) {ListNode cur = head; // 大哥ListNode pre = head; // 小弟while (pre != null) {// 如果要删除的是 head,特殊处理if (pre.val == val) {pre = pre.next;head = pre;} else break;}if (head == null) return null; // 保证此时不是空链表cur = pre.next; // 大哥先走一步while (cur != null) {//System.out.println("\ncur=" + cur.val + ", pre=" + pre.val + ", cur.next=" + cur.next);if (cur.val == val) {// 要删除pre.next = cur.next; // 让小弟 next 指向大哥的 next,pre 不能往前走cur = cur.next; // 大哥走一步//System.out.println("删除之后,pre=" + pre + ", pre.next=" + pre.next);} else {pre = cur; // 小弟踩着大哥的脚印cur = cur.next; // 大哥先走一步}}return head;}}

评论区题解

前两行是个小技巧。

此题删除链表中元素是很简单的,只需要让待删节点之前一个节点指向待删节点之后一个节点即可。 此题最大的问题就是,题目要求我们要返回新链表中的头结点,如果我们就采用仅仅复制头结点的方式(用H=head)然后用H进行操作,最后返回head。这样就会导致如果头结点也是我们需要删除的节点就会导致错误。当然我们可以采用循环操作判断第一个不是我们要删除的节点,但是这样有些麻烦。最好的方式就是我们创建一个新节点来作为整个链表的头结点,该节点中的值没有意义,只是用该节点来方便我们的操作。如果用H->next=head; 此时 我们操作H的话就把原先的头结点当做了一个普通节点来操作,此时原先的头结点就可以被删除了。最后返回H->next就满足条件了。正是由于有个无意义节点作为头结点会统一操作(把头结点当做普通节点)所以实际链表设计过程中都是有个无意义头结点的,遇到头结点不好解决的问题,大家可以设一个节点试试。

public ListNode removeElements(ListNode head, int val) {ListNode header = new ListNode(-1);header.next = head;ListNode cur = header;while(cur.next != null){if(cur.next.val == val ){cur.next = cur.next.next;}else{cur = cur.next;}}return header.next;}

如果觉得《leetcode 203. 移除链表元素》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。