链表中删除倒数第K个节点

问题描述

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

问题分析与解决

  从问题当中,我们只能得到一个链表和要删除的第K个节点的信息,于是就有以下思路:如果链表为空或者K<0时,直接返回;如若不然,遍历链表的每个节点,每经过一个节点K减1。比如对于1 --> 2 --> 3 --> 4该链表的过程如下:

  K = 5,所遍历的节点以及K值的变化:1 -- > 2 --> 3 --> 4  4,3,2,1;

  K = 4,所遍历的节点以及K值的变化:1 -- > 2 --> 3 --> 4  3,2,1,0;

  K = 3,所遍历的节点以及K值的变化:1 -- > 2 --> 3 --> 4  2,1,0,-1;

  K = 2,所遍历的节点以及K值的变化:1 -- > 2 --> 3 --> 4  1,0,-1,-2;

  由上可知,遍历链表中的节点,每经过一个节点K值减1的过程中,当K > 1时,说明链表中要删除的倒数第K个节点不存在,此时已经超出链表的长度;当K = 0时,此时正好要删除的是链表中的第一个节点,这是只需头节点指向头节点的下一个节点即可;那么对于K < 0时,该如何删除链表中倒数第K的节点呢?

  经过上面的步骤后,如果K<0,此时重新遍历链表,只不过这时是每经过一个节点K值增1。如下示例(K值保存经过减1后的结果):

  K = -1,所遍历的节点以及K值的变化:1  0;

  K = -2,所遍历的节点以及K值的变化:1 -- > 2   -1,0;

  在遍历链表K值增1的过程中,当K = 0时,所在的位置正好是要删除倒数第K个节点的前一个节点,此时只需将前一个节点指向要删除的节点的下一节点即可。

代码实现(单链表):

 1 class Node(object):
 2     def __init__(self, data):
 3         self.data = data
 4         self.next = None
 5
 6 def createSingleLink():
 7     head = Node(1)
 8     cur = head
 9     for i in range(2, 10):
10         cur.next = Node(i)
11         cur = cur.next
12     return head
13
14 def printSingleLink(head):
15     cur = head
16     while cur:
17         print(cur.data, end=‘‘)
18         if cur.next:
19             print(‘-->‘, end=‘‘)
20         cur = cur.next
21
22 def removeLastKthNode(head, lastKth):
23     if head is None or lastKth < 0:
24         return head
25     cur = head
26     # lastKth -= 1
27     while cur:
28         lastKth -= 1
29         cur = cur.next
30     # print(lastKth)
31     if lastKth == 0:
32         head = head.next
33     if lastKth < 0:
34         cur = head
35         lastKth += 1
36         while lastKth < 0:
37             cur = cur.next
38             lastKth += 1
39         cur.next = cur.next.next
40     return head
41
42 if __name__ == ‘__main__‘:
43     singleHead = createSingleLink()
44     printSingleLink(singleHead)
45     print()
46     newSingleHead = removeLastKthNode(singleHead, 6)
47     printSingleLink(newSingleHead)

  上述代码是对删除单链表倒数第K个节点的实现,那么对于双链表的实现过程和单链表的过程相同,只不过在删除某一节时要注意节点的前驱指针的指向。

代码实现(双链表):

 1 class Node(object):
 2     def __init__(self, data):
 3         self.last = None
 4         self.data = data
 5         self.next = None
 6
 7 def createDoubleLink():
 8     head = Node(1)
 9     cur = head
10     for i in range(2, 10):
11         cur.next = Node(i)
12         cur = cur.next
13     return head
14
15 def printLink(head):
16     cur = head
17     while cur:
18         print(cur.data, end=‘‘)
19         if cur.next:
20             print(‘-->‘, end=‘‘)
21         cur = cur.next
22
23 def removeLastKthNode(head, lastKth):
24     if head is None or lastKth < 0:
25         return head
26     cur = head
27     while cur:
28         lastKth -= 1
29         cur = cur.next
30     if lastKth == 0:
31         head = head.next
32         head.last = None
33     if lastKth < 0:
34         cur = head
35         lastKth += 1
36         while lastKth < 0:
37             cur = cur.next
38             lastKth += 1
39         if cur.next.next:
40             cur.next = cur.next.next
41             cur.next.last = cur
42         else:
43             cur.next = None
44     return head
45
46 if __name__ == ‘__main__‘:
47     doubleLinkHead = createDoubleLink()
48     printLink(doubleLinkHead)
49     print()
50     newDoubleLinkHead = removeLastKthNode(doubleLinkHead, 6)
51     printLink(newDoubleLinkHead)

原文地址:https://www.cnblogs.com/dabric/p/11706827.html

时间: 2024-10-18 20:45:20

链表中删除倒数第K个节点的相关文章

算法总结之 在单链表和双链表中删除倒数第k个节点

分别实现两个函数,一个可以删除单链表中倒数第k个节点,另一个可以删除双链表中倒数第k个节点 思路: 如果链表为空,或者k<1 参数无效 除此之外 让链表从头开始走到尾,每移动一步,就让k的值减1 当链表走到头时候 如果k值大于0   说明不用调整  因为链表根本没有倒数第k个节点 此时将原链表直接返回即可 如果k值=0,说明链表倒数第k个节点就是头节点,此时直接返回head.next 也就是原链表的第二个节点 让第二个节点作为链表的头节点,此时直接返回head.next 如果k值<0  重新从

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

题目:分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点 要求:如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1) My: 删除单链表或双链表中倒数第K个节点,核心代码(单链表和双链表的方法定义参见另一篇文:https://www.cnblogs.com/latup/p/9823179.html): 1 def del_k(L, k): 2 index = L.length - k + 1 3 L.delt(index) 原文地址:htt

链表问题----删除倒数第K个节点

在单链表和双链表中删除倒数第K个节点 分别实现两个函数,一个可以删除单链表中的倒数第K个节点,一个可以删除双链表中的倒数第k 个节点,要求时间复杂度是 O(N),空间复杂度是 O(1). [解析] 基本思路: 让链表从头开始走到尾,每移动一步,就让k值减一,当k 值走到结尾时, 如果k 值大于0,说明链表根本没有倒数第k 个节点 如果等于0,那么头节点就是倒数第k 个节点,此时应该返回 head.next 如果小于0,则重新从头节点开始,每移动一步,k 值增加一,当k 等于0时,移动停止,移动到

[算法]在单链表和双链表中删除倒数第k个结点

题目: 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 要求: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 解答: 让链表从头走到尾,每移动一步,就让K值减一,当链表走到结尾时,如果K值大于0,说明不用调整链表,因为链表根本没有倒数第K个节点,此时将原链表直接返回即可:如果K值等于0,说明链表倒数第K个节点就是头结点,此时直接返回head.next,相当于删除了头结点.当K的值小于零时,再次从头结点开始走,每移动一步,就让

leetcode链表--18、remove-nth-node-from-end-of-list(从链表中删除倒数第k个结点)

题目描述 Given a linked list, remove the nth node from the end of list and return its head. For example, Given linked list: 1->2->3->4->5, and n = 2.   After removing the second node from the end, the linked list becomes 1->2->3->5. Note:

单链表中查找倒数第K个节点

// 查找链表的倒数第K个结点 PSListNode FindLastKNode(PSListNode pHead, int K ) { PSListNode pFast = pHead ; PSListNode pSlow = pHead ; if (pHead == NULL || K <= 0) { return NULL ; } while (--K ) { if (pFast == NULL ) { return NULL ; } pFast = pFast->pNext; } wh

如何找出单链表中的倒数第k个元素

(1)方法1:首先遍历一遍单链表,求出整个单链表的长度n,然后将倒数第k个,转换为正数第n-k个,接下去遍历一次就可以得到结果.但该算法需要对链表进行两次遍历,第一次遍历用于求解单链表的长度,第二次遍历用于查找正数第n-k个元素. (2)方法2:如果沿着从头到尾的方向,从链表中的某个元素开始,遍历k个元素后刚好达到链表尾,那么该元素就是要找的倒数第k个元素.根据这一性质,可以设计如下算法:从头节点开始,一次对链表的每一个节点元素进行这样的测试,遍历k个元素,查看是否到达链表尾,直到找到那个倒数第

链表中获取倒数第K个结点

/* * 链表中查找倒数第K个结点.cpp * * Created on: 2018年5月1日 * Author: soyo */ #include<iostream> using namespace std; struct Node { int num; Node * next; }; Node * creat() { Node *head=NULL; head=new Node; head->num=9; head->next=NULL; return head; } Node

找出单向链表中的倒数第k个结点

import java.util.Scanner; public class List { private Node first; private int N; class Node{ int data; Node next; } //顺便复习一下链表 public int size() { return N; } public boolean isEmpty() { return first==null; } public Node FindPrev(int pos){ Node tmp=fi