鉴于这次的两题,异常的短,所以再次合二为一。分别是第237,难度简单,以及283题,难度同样简单。
原题地址:https://leetcode-cn.com/problems/delete-node-in-a-linked-list/ & https://leetcode-cn.com/problems/move-zeroes/
题目描述:
第一题是删除链表中的节点,题目很长,反正主要就是一句话:
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。
第二题是移动零,题目很简单,也是一句话:
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
解题思路:
先说第一题,删除链表中的节点,这题确实很简单。直接将节点的next指针,指向原本的next.next节点就可以了。所以不难。
再来说第二题,写的略显复杂了。当时我不懂什么双指针,现在我懂了。所以讲两种方法:
第一种就是我现在写的,单指针遍历数组,遇到非0的,就去后面找0,然后让0和0相邻的元素更换位置。这个是什么鬼操作,我也想不通,可能脑回路出了点问题...
第二种双指针的方法,会快很多。两个指针分别从第一个元素出发。快指针用于寻找非0元素,慢指针用于记录非零元素的个数(也就是坐标)。当快指针找到一个非0元素,那就直接和慢指针所指向的元素换个位置就好了。
比如1,2,3,4,0,5,6,7,0,8,9,0,前4个元素都是正常的,快指针遇到5时,慢指针指向的还是0,所以交换,变成1,2,3,4,5,0,6,7,0,8,9,0。当快指针遇到6时,慢指针指向的还是0。最后就变成了1,2,3,4,5,6,7,8,9,0,0,0。
中文官网题解:
https://leetcode-cn.com/problems/delete-node-in-a-linked-list/solution/
https://leetcode-cn.com/problems/move-zeroes/solution/
个人题解:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public void deleteNode(ListNode node) {
node.val = node.next.val;
node.next = node.next.next;
}
}
/**
* 移动零
*/
public class Solution {
public void moveZeroes(int[] nums) {
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0 && i != 0) {
for (int j = i; j > 0 && nums[j - 1] == 0; j--) {
int temp = nums[j - 1];
nums[j - 1] = nums[j];
nums[j] = temp;
}
}
}
}
}
结果:
下面是分别的运算结果。嗯,移动零的题目,速度莫名的慢。