📌  相关文章
📜  用于删除链表的每个第 K 个节点的Python程序

📅  最后修改于: 2022-05-13 01:56:56.400000             🧑  作者: Mango

用于删除链表的每个第 K 个节点的Python程序

给定一个单链表,你的任务是删除链表的每个第 K 个节点。假设 K 总是小于或等于 Linked List 的长度。
例子 :

Input: 1->2->3->4->5->6->7->8  
        k = 3
Output: 1->2->4->5->7->8
As 3 is the k-th node after its deletion list 
would be 1->2->4->5->6->7->8
And now 4 is the starting node then from it, 6 
would be the k-th node. So no other kth node 
could be there.So, final list is:
1->2->4->5->7->8.

Input: 1->2->3->4->5->6  
       k = 1
Output: Empty list 
All nodes need to be deleted

这个想法是从头开始遍历列表并跟踪上次删除后访问的节点。每当count变为k时,删除当前节点并将count重置为0。

Traverse list and do following
   (a) Count node before deletion.
   (b) If (count == k) that means current 
        node is to be deleted.
      (i)  Delete current node i.e. do

          //  assign address of next node of 
          // current node to the previous node
          // of the current node.
          prev->next = ptr->next i.e.

       (ii) Reset count as 0, i.e., do count = 0.
   (c) Update prev node if count != 0 and if
       count is 0 that means that node is a
       starting point.
   (d) Update ptr and continue until all 
       k-th node gets deleted.

下面是实现。

Python3
# Python3 program to delete every 
# k-th Node of a singly linked list.
import math
  
# Linked list Node 
class Node: 
    def __init__(self, data): 
        self.data = data 
        self.next = None
  
# To remove complete list (Needed 
# for case when k is 1)
def freeList(node):
    while (node != None):
        next = node.next
        node = next
    return node
  
# Deletes every k-th node and 
# returns head of modified list.
def deleteKthNode(head, k):
      
    # If linked list is empty
    if (head == None):
        return None
  
    if (k == 1):
        freeList(head)
        return None
      
    # Initialize ptr and prev before 
    # starting traversal.
    ptr = head
    prev = None
  
    # Traverse list and delete every 
    # k-th node
    count = 0
    while (ptr != None):
          
        # Increment Node count
        count = count + 1
  
        # Check if count is equal to k
        # if yes, then delete current Node
        if (k == count):
              
            # Put the next of current Node in
            # the next of previous Node
            # delete(prev.next)
            prev.next = ptr.next
  
            # Set count = 0 to reach further
            # k-th Node
            count = 0
          
        # Update prev if count is not 0
        if (count != 0):
            prev = ptr
  
        ptr = prev.next
      
    return head
  
# Function to print linked list 
def displayList(head):
    temp = head
    while (temp != None):
        print(temp.data, 
              end = ' ')
        temp = temp.next
      
# Utility function to create 
# a new node.
def newNode( x):
    temp = Node(x)
    temp.data = x
    temp.next = None
    return temp
  
# Driver Code
if __name__=='__main__': 
      
    # Start with the empty list 
    head = newNode(1)
    head.next = newNode(2)
    head.next.next = newNode(3)
    head.next.next.next = newNode(4)
    head.next.next.next.next = 
    newNode(5)
    head.next.next.next.next.next = 
    newNode(6)
    head.next.next.next.next.next.next = 
    newNode(7)
    head.next.next.next.next.next.next.next = 
    newNode(8)
  
    k = 3
    head = deleteKthNode(head, k)
  
    displayList(head)
# This code is contributed by Srathore


输出:

1 2 4 5 7 8

时间复杂度: O(n)

请参阅完整文章删除链表的每个第 k 个节点以获取更多详细信息!