关闭

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

138人阅读 评论(0) 收藏 举报
分类:

 本文是左程云老师所著的《程序员面试代码指南》第二章中“在单链表和双链表中删除倒数第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);
	}
}



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:20950次
    • 积分:787
    • 等级:
    • 排名:千里之外
    • 原创:65篇
    • 转载:10篇
    • 译文:0篇
    • 评论:5条
    文章分类
    最新评论