简单编程题目连载(二)

原创 2017年01月03日 23:17:37

在单链表和双链表中删除倒数第K个节点

题目:分别实现两个函数,一个可以删除单链表中倒数第k个节点,另一个可以删除双链表中倒数第k个节点。

要求:如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1)。

思路:
如果链表为空,或者k小于1,那么无需进行处理,因为属于无效输入,直接返回即可。

当链表的长度大于1时,从链表头开始,遍历每个元素,每遍历一个元素,令k-1,直到遍历结束。

如果k>=1,说明k值大于整个链表的长度,没有可以进行删除的元素。

如果k=0,说明k值等于链表的长度,相当于删除链表的头节点,令head=head.next;即可。

如果k<0,说明要删除的元素处于链表中间。删除链表中间的元素需要进行两步操作:找到删除元素的前一个节点;将该元素指向待删除元素的下一个节点。

此时进行第二次遍历,每经过一个节点,k+1,直到k=0为止。
因为第N-K个节点为目标节点的前一个节点。换个想法,而当k<0时,x+k=0,x=-k,互补的关系,这个第x个节点就是目标节点的前一个节点。

class Node{
    int value;
    Node next;
    public Node(int data){
        this.value = data;
    }
}

class test{
    public Node removeLastKthNode(Node head,int lastKth){
        if(head == null || lastKth < 1){
            return head;
        }
        Node cur = head;
        while(cur != null){
            cur = cur.next;
            lastKth--;
        }
        if(lastKth == 0){
            return head.next;
        }
        if(lastKth < 0){
            cur = head;
            while(++lastKth != 0){
                cur = cur.next;
            }
            cur.next = cur.next.next;
        }
        return head;
    }
}

对于双向链表而言前面的步骤是一样的,不同在于不光要处理指向后,还要处理指向前。

class DoubleNode{
    public int value;
    public DoubleNode last;
    public DoubleNode next;
    public DoubleNode(int data){
        this.value = data;
    }
}

public DoubleNode removeLastKthNode(DoubleNode head,int lastKth){
    if(head == null || lastKth < 1){
            return head;
        }
        DoubleNode cur = head;
        while(cur != null){
            cur = cur.next;
            lastKth--;
        }
        if(lastKth == 0){
            head = head.next;
            head.last = null;
        }
        if(lastKth < 0){
            cur = head;
            while(++lastKth != 0){
                cur = cur.next;
            }
            DoubleNode newNext = cur.next.next;
            head.next = newNext;
            if(newNext != null){
                newNext.last = cur;
            }
        }
        return head;
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

考基本功的 10 个简单编程题

一、给一个数 N,判定这个数是否是素数。 1、先让面试者说素数的定义,如果不知道可以提示素数的定义 2、最差的面试者,会没有思路,这是很可怕的,大学第一学期学完,应该学会这个题 3、一般的面试者...
  • lifushan123
  • lifushan123
  • 2015年04月25日 16:35
  • 459

简单编程题目连载(三)

二叉树边界节点
  • WDZTSXCDH
  • WDZTSXCDH
  • 2017年01月13日 16:59
  • 228

Java 经典简单题

1.String是最基本的数据类型吗,Java基本类型有哪些?  String不是基本数据类型,基本类型有 byte char int short long float double boolean...
  • pengpeng2395
  • pengpeng2395
  • 2016年10月28日 17:04
  • 764

简单编程题目连载(五)——找零钱

记忆搜索法,找零钱
  • WDZTSXCDH
  • WDZTSXCDH
  • 2017年01月15日 22:05
  • 584

简单编程题目连载(六)——找零钱

经典动态规划
  • WDZTSXCDH
  • WDZTSXCDH
  • 2017年01月16日 16:19
  • 323

简单编程题目连载(四)——找零钱

经典动态规划的暴力求解
  • WDZTSXCDH
  • WDZTSXCDH
  • 2017年01月15日 11:48
  • 267

简单递归入门题

帮助理解递归算法的一些入门级别题目合集
  • liujunyang0926
  • liujunyang0926
  • 2016年11月17日 20:50
  • 259

神经网络入门(连载1-6)

神经网络入门> .  (连载之一) 用平常语言介绍神经网络 (Neural Networks in Plain English) ...
  • Leytton
  • Leytton
  • 2014年08月14日 14:46
  • 3388

腾讯一面二面题目

腾讯一面 1、  new&delete 和malloc&free的区别 2、  select 和pool的区别 3、  内存分配有几种方式?请举例说明 答:四种:静态区,bss,堆,栈 4、  解释...
  • sole_cc
  • sole_cc
  • 2015年04月21日 10:31
  • 750

题目1104: 二叉排序树

题目描述 输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历。   输入 输入第一行包括一个整数n(1   输出 可能有多...
  • SJF0115
  • SJF0115
  • 2013年03月17日 09:47
  • 2082
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:简单编程题目连载(二)
举报原因:
原因补充:

(最多只允许输入30个字)