有序数组的平方:
我的错误解法:
public class Test { public static void main(String[] args) { Solution s = new Solution(); int[] nums = {-5,-3,-2,-1}; System.out.println(Arrays.toString(s.removeElement(nums)));; } } class Solution { public int[] removeElement(int[] nums) { int min = 0; int max = nums.length-1; while (min != max){ if(Math.abs(nums[min]) > Math.abs(nums[max])){ int temp = nums[max]; nums[max] = (int)Math.pow(nums[min],2); nums[min] = temp; max --; }else{ nums[max] = (int)Math.pow(nums[max],2); max --; } } nums[min] = (int)Math.pow(nums[min],2); return nums; } }
在我自己的这种解法中,在一些数组中并不适用。比如这里的例子-5,-3,-2,-1.
第一轮nums[3]=25,nums[0]=-1。而第二轮直接用-1和-2比较,中间的-3其实才是最大的数,所以错误。
这也是为什么解答答案中必须用一个新数组去记录的原因!
移除链表元素
这里有两个地方要注意
1.怎么处理头节点,如果不加入虚拟头节点那么就要分两种情况去删除元素:判断是否为头节点
2.空指针异常的警告问题
我的错误代码:
在这里 我们应该写:
while (head != null && head.val == val) while(temp != null && temp.next != null) 我们需要先判断一下指针是否为空,为空指针我们不能够去访问其next也不能访问其val值,否则会报错 正确写法如下:class Solution { public ListNode removeElements(ListNode head, int val) { while (head != null && head.val == val ){ head = head.next; } ListNode temp = head; while(temp != null && temp.next != null){ if (temp.next.val == val){ temp.next = temp.next.next; }else{ temp = temp.next; } } return head; } }
还一种带虚拟头节点的
ListNode dummy = new ListNode(); dummy.next = head; ListNode temp = dummy; while (temp.next != null){ if (temp.next.val == val){ temp.next = temp.next.next; }else{ temp = temp.next; } } return dummy.next;
反转链表
双指针的方法:
首先两个需要注意的点:
① 在最开始初始化的时候pre的赋值,这里应该是赋值null,因为最开始的头结点应该变成尾结点指向空
② 在改变了next指向的时候,需要增加一个temp来保留原先的next指向的结点,避免在改变了指向之后找不到原先的下一结点。
我写的代码:
class Solution { public ListNode reverseList(ListNode head) { ListNode pre = null; ListNode cur = head; ListNode temp = cur.next; while (cur != null){ cur.next = pre; pre = cur; cur = temp; if (temp.next != null){ temp = temp.next; } } return pre; } }
但这里我本来写的
cur.next = pre; pre = cur; cur = temp; temp = temp.next;
这其实是有错误的,当我的temp本来指向的就是null之后,我是没有办法遍历它的next的,会出现空指针异常
需要更改的话,其实我可以将temp指针的赋值操作提到最前面,就不会有这个问题了。
正确写法如下:
class Solution { public ListNode reverseList(ListNode head) { ListNode pre = null; ListNode cur = head; ListNode temp; while (cur != null){ temp = cur.next; cur.next = pre; pre = cur; cur = temp; } return pre; } }
还有一种写法是写成递归的形式:
这一种形式最好是在写了双指针的解法之后去更改
这里也要注意一点就是空指针异常
temp的赋值要是在if判断之前就会出现空指针异常的问题,我们如果放在了下面就避免了我们去访问null的next的问题了。
class Solution { public ListNode reverseList(ListNode head){ ListNode pre = null; ListNode cur = head; return reverse(cur,pre); } public ListNode reverse(ListNode cur, ListNode pre){ if (cur == null){ return pre; } ListNode temp = cur.next; cur.next = pre; return reverse(temp,cur); } }
标签:ListNode,cur,temp,nums,笔记,next,力扣,null,刷题 From: https://www.cnblogs.com/gjwqz/p/18416087