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

原创 2016年06月01日 14:10:41

 本文是左程云老师所著的《程序员面试代码指南》第二章中“在单链表和双链表中删除倒数第K个节点”中的一道题目。

   特此感谢左程云老师。

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

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

[思路]:思路很多,直接介绍一种。

让链表从头开始走到尾,每移动一步,就让k值减1,存在以下三种情况:

1)K<0  链表根本没有第k个节点

2)K=0  链表第k个节点就是头节点

3)K>0  a.重新从头节点开始走,每移动一步,让k值加1

              b.当k等于0时,移动停止,移动到的节点就是要删除节点的前一个节点。

仔细想想挺好理解的,现在只贴出点链表的代码:

package zcy_2;

public class RemoveLastKthNode {

	public static class Node {
		public int value;
		public Node next;

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

	public static void printLinkedList(Node head) {
		System.out.print("Linked List: ");
		while (head != null) {
			System.out.print(head.value + " ");
			head = head.next;
		}
		System.out.println();
	}
	
	public static void main(String[] args) {
		Node head1 = new Node(1);
		head1.next = new Node(2);
		head1.next.next = new Node(3);
		head1.next.next.next = new Node(4);
		head1.next.next.next.next = new Node(5);
		head1.next.next.next.next.next = new Node(6);
		printLinkedList(head1);
		
	head1 = removeLastKthNode(head1, 3);
		printLinkedList(head1);
	}
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

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

实现的完整代码如下: //在单链表和双链表中删除倒数第k个节点 public class DeleteList{ //单链表节点的定义 public static clas...

左程云_算法与数据结构 — 链表问题 — 02在单链表和双链表中删除倒数第K个节点

问题描述分别实现两个方法,一个可以删除单链表中的倒数第k个节点,另一个可以删除双链表的倒数第k个节点问题分析 先处理特殊的情况:k=0的时候,此时无法输出这样的节点 一般的考虑: ①遍历链表,k...

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

【题目】   分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点。【要求】   如果链表长度为N,时间复杂度达到O(N),时间复杂度达到O(N),额外空间复...

取单链表倒数第k个元素

  • 2011年12月07日 11:57
  • 7KB
  • 下载

链表之删除双链表倒数第K个节点

链表之删除双链表倒数第K个节点 题目: 链表之删除双链表倒数第K个节点 思路: 之前写过http://blog.csdn.net/u011068702/article/detail...

算法优解(5)-删除单链表的倒数第k个节点

来自左神书中的一道题,在左神核心代码的基础上,添加了链表的构建和输出以及删除节点的打印,将这道题完善成了一个小Demo,和各位共勉。 题目: * 给定一个单链表,删除它的倒数第k个节点。 * 例如给定...

在单链表中删除倒数第k个节点(java实现)

实现方式很多,在这里只说两种实现方式。看不懂时候,大家可以画画图,对理解为什么很有帮助。 第一种方式: 1.首先判断K值和链表是否为空,如果k...

链表面试题---删除倒数第k个结点、逆置单链表

要删除链表倒数第k个结点,需满足下述条件: 1、链表不能为空; 2、k不能等于0; 3、k不能大于链表的结点总数(链表长度) 删除时,应先找到倒数第k个结点,并标记该结点的前一个结点和后一个结...

链表面试题(六)---删除单链表倒数第k个结点

一、结构体定义typedef int DataType;typedef struct ListNode//定义结点 { DataType data; struct ListNode* ...

查找单链表的倒数第K个元素

算法思想:设置双指针,p1和p2,先让p1指针从头开始遍历k-1个节点,然后让p1继续遍历,p2从头遍历(p1和p2同时遍历),当p1遍历到链表的末尾,此时p2指针所指向的正好是倒数第k个节点。 如...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在单链表和双链表中删除倒数第K个节
举报原因:
原因补充:

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