20200221
题目 :实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
注意:本题相对原题稍作改动
示例:
输入: 1->2->3->4->5 和 k = 2
输出: 4
思路 :双指针,fast指针与slow指针保存k个间隔。
code
public int kthToLast(ListNode head, int k){
ListNode fast = head;
ListNode slow = head;
while(k>0 && fast != null){
k--;
fast = fast.next;
}
while(slow != null && fast != null){
slow = slow.next;
fast = fast.next;
}
return slow.val;
}
题目 :删除中间节点。实现一种算法,删除单向链表中间的某个节点(除了第一个和最后一个节点,不一定是中间节点),假定你只能访问该节点。
示例:
输入:单向链表a->b->c->d->e->f中的节点c
结果:不返回任何数据,但该链表变为a->b->d->e->f
思路 :很简单,代码一目了然。
code
public void deleteNode(ListNode node) {
assert node != null && node.next != null;
node.val = node.next.val;
node.next = node.next.next;
}
题目 :分割链表。编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的 节点之前。如果链表中包含 x,x 只需出现在小于 x 的元素之前(如下所示)。分割元素 x 只需处于“右半部分”即可,其不需要被置于左右两部分之间。
示例:
输入: head = 3->5->8->5->10->2->1, x = 5
输出: 3->1->2->10->5->5->8
思路 :使得所有小于x的节点排在大于或等于x的节点之前,即只要比x小的在x之前就行了,不需要关注比x大的位置。
双指针,一个用来从第一位开始存放比x小的数,另一个指针遍历,如果遇到就交换两个指针的值。
code
扫描二维码关注公众号,回复:
9946069 查看本文章
public ListNode partition(ListNode head,int x){
ListNode a1 = head; ListNode a2 = head;
while(a1 != null){
if(a1.val < x){
swap(a1,a2);
a2 = a2.next;
}
a1 = a1.next;
}
return head;
}
private void swap(ListNode a1, ListNode a2){
int temp = a1.val;
a1.val = a2.val;
a2.val = temp;
}