程序员面试经典-20200221

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;
}
发布了94 篇原创文章 · 获赞 13 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_31900497/article/details/104425268