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

题目

实现一个函数,可以删除单链表中倒数第K个节点。


要求

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


思路

如果链表为空或者K值小于1,直接返回head即可,除此之外,从头遍历链表,并让K-1.

链表和K值 走到的节点 K变化
1->2->3 K=4 链表不存在倒数第4个节点 1->2->3 3 2 1
1->2->3 K=3 链表倒数第3个节点是1节点 1->2->3 2 1 0
1->2->3 K=2 链表倒数第2个节点是2节点 1->2->3 1 0 -1

由上表三种情况可知

  • 若K=0,返回head即可
  • 若K=1,返回head.next即可,即只删除第一个节点
  • 若K<0,如上表中最后一行,想要删除2,需要找到1,然后1—>3,达到删除节点2的目的

具体方法如下:

1>重新从头开始遍历链表,每移动一步,将K值加1

2>当K值等于0时,移动停止,当前节点即为要删除节点的前一个节点。

对2>进行解释:如果链表长为N,如果要删除倒数第K个节点,则该节点的前一个节点为第N-K个节点。在第一次遍历后,K值变为K-N;和N-K为相反值,所以在第二次遍历时,K的值不断加1,到0停止,就会停到第N-K个节点的位置。


源码

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

public 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;
}
发布了43 篇原创文章 · 获赞 21 · 访问量 4923

猜你喜欢

转载自blog.csdn.net/flying_1314/article/details/103834539