📜  从中间到链接列表的开头查找第k个节点

📅  最后修改于: 2021-04-23 17:40:11             🧑  作者: Mango

给定链接列表和数字K。任务是从列表的中间到开头打印第K个节点的值。如果不存在这样的元素,则打印“ -1”。

注意:中间节点的位置是:(n / 2)+1,其中n是列表中节点的总数。

例子

Input :  List is 1->2->3->4->5->6->7
         K= 2 
Output : 2

Input :  list is 7->8->9->10->11->12
         K = 3
Output : 7

从头到尾遍历列表并计算节点总数。现在,假设n是列表中节点的总数。因此,中间节点将位于位置(n / 2)+1。现在,任务仍然是从列表的开头打印在第(n / 2 + 1 – k)位置的节点。

下面是上述想法的实现:

C++
// CPP program to find kth node from middle
// towards Head of the Linked List
  
#include 
  
using namespace std;
  
// Linked list node
struct Node {
    int data;
    struct Node* next;
};
  
/* Given a reference (pointer to  
   pointer) to the head of a list 
   and an int, push a new node on 
   the front of the list. */
void push(struct Node** head_ref,
          int new_data)
{
    struct Node* new_node = new Node;
    new_node->data = new_data;
    new_node->next = (*head_ref);
    (*head_ref) = new_node;
}
  
// Function to count number of nodes
int getCount(struct Node* head)
{
    int count = 0; // Initialize count
    struct Node* current = head; // Initialize current
    while (current != NULL) {
        count++;
        current = current->next;
    }
    return count;
}
  
// Function to get the kth node from the mid
// towards begin of the linked list
int printKthfrommid(struct Node* head_ref, int k)
{
    // Get the count of total number of
    // nodes in the linked list
    int n = getCount(head_ref);
  
    int reqNode = ((n / 2 + 1) - k);
  
    // If no such node exists, return -1
    if (reqNode <= 0) {
        return -1;
    }
  
    // Find node at position reqNode
    else {
        struct Node* current = head_ref;
  
        // the index of the
        // node we're currently
        // looking at
        int count = 1;
        while (current != NULL) {
            if (count == reqNode)
                return (current->data);
            count++;
            current = current->next;
        }
    }
}
  
// Driver code
int main()
{
    // start with empty list
    struct Node* head = NULL;
    int k = 2;
  
    // create linked list
    // 1->2->3->4->5->6->7
    push(&head, 7);
    push(&head, 6);
    push(&head, 5);
    push(&head, 4);
    push(&head, 3);
    push(&head, 2);
    push(&head, 1);
  
    cout << printKthfrommid(head, 2);
  
    return 0;
}


Java
// Java program to find Kth node from mid
// of a linked list in single traversal
  
// Linked list node
class Node
{
    int data;
    Node next;
    Node(int d)
    {
        this.data = d;
        this.next = null;
    }
}
  
class LinkedList
{
    Node start;
    LinkedList()
    {
        start = null;
    }
      
    // Function to push node at head
    public void push(int data)
    { 
        if(this.start == null)
        {
            Node temp = new Node(data);
            this.start = temp;
        }
        else
        {
            Node temp = new Node(data);
            temp.next = this.start;
            this.start = temp;
        }
    }
      
    //method to get the count of node
    public int getCount(Node start)
    {
        Node temp = start;
        int cnt = 0;
        while(temp != null)
        {
            temp = temp.next;
            cnt++;
        }
        return cnt;
    }
      
    // Function to get the kth node from the mid
    // towards begin of the linked list
    public int printKthfromid(Node start, int k)
    { 
        // Get the count of total number of
        // nodes in the linked list
        int n = getCount(start);
        int reqNode = ((n + 1) / 2) - k;
  
        // If no such node exists, return -1
        if(reqNode <= 0)
            return -1;
        else
        {
            Node current = start;
            int count = 1,ans = 0;
            while (current != null) 
            { 
                if (count == reqNode) 
                {
                    ans = current.data;
                    break; 
                }
                count++; 
                current = current.next; 
            }
            return ans;
        }
    }
      
    // Driver code
    public static void main(String[] args) 
    {
    // create linked list
        // 1->2->3->4->5->6->7 
    LinkedList ll = new LinkedList();
        ll.push(7);
        ll.push(6);
        ll.push(5);
        ll.push(4);
        ll.push(3);
        ll.push(2);
        ll.push(1);
        System.out.println(ll.printKthfromid(ll.start, 2));
    }
}
  
// This Code is contributed by Adarsh_Verma


Python3
# Python3 program to find kth node from 
# middle towards Head of the Linked List
  
# Node class 
class Node: 
  
    # Function to initialise the node object 
    def __init__(self, data): 
        self.data = data 
        self.next = None
  
# Function to insert a node at the 
# beginning of the linked list 
def push(head, data): 
    if not head: 
  
        # Return new node 
        return Node(data) 
      
    # allocate node 
    new_node = Node(data) 
      
    # link the old list to the new node 
    new_node.next = head 
      
    # move the head to point
    # to the new node 
    head = new_node 
    return head 
  
# Function to count number of nodes
def getCount(head):
      
    count = 0 # Initialize count
    current = head # Initialize current
    while (current ): 
        count = count + 1
        current = current.next
      
    return count
  
# Function to get the kth node from the mid
# towards begin of the linked list
def printKthfrommid(head_ref, k):
  
    # Get the count of total number of
    # nodes in the linked list
    n = getCount(head_ref)
  
    reqNode = int((n / 2 + 1) - k)
  
    # If no such node exists, return -1
    if (reqNode <= 0) :
        return -1
      
    # Find node at position reqNode
    else :
        current = head_ref
  
        # the index of the
        # node we're currently
        # looking at
        count = 1
        while (current) :
            if (count == reqNode):
                return (current.data)
            count = count + 1
            current = current.next
          
# Driver Code 
if __name__=='__main__': 
      
    # start with empty list
    head = None
    k = 2
  
    # create linked list
    # 1.2.3.4.5.6.7
    head = push(head, 7)
    head = push(head, 6)
    head = push(head, 5)
    head = push(head, 4)
    head = push(head, 3)
    head = push(head, 2)
    head = push(head, 1)
   
    print(printKthfrommid(head, 2))
      
# This code is contributed by Arnab Kundu


C#
// C# program to find Kth node from mid
// of a linked list in single traversal
using System;
  
// Linked list node
public class Node
{
    public int data;
    public Node next;
    public Node(int d)
    {
        this.data = d;
        this.next = null;
    }
}
  
public class LinkedList
{
    Node start;
    LinkedList()
    {
        start = null;
    }
      
    // Function to push node at head
    public void push(int data)
    { 
        if(this.start == null)
        {
            Node temp = new Node(data);
            this.start = temp;
        }
        else
        {
            Node temp = new Node(data);
            temp.next = this.start;
            this.start = temp;
        }
    }
      
    //method to get the count of node
    public int getCount(Node start)
    {
        Node temp = start;
        int cnt = 0;
        while(temp != null)
        {
            temp = temp.next;
            cnt++;
        }
        return cnt;
    }
      
    // Function to get the kth node from the mid
    // towards begin of the linked list
    public int printKthfromid(Node start, int k)
    { 
        // Get the count of total number of
        // nodes in the linked list
        int n = getCount(start);
        int reqNode = ((n + 1) / 2) - k;
  
        // If no such node exists, return -1
        if(reqNode <= 0)
            return -1;
        else
        {
            Node current = start;
            int count = 1,ans = 0;
            while (current != null) 
            { 
                if (count == reqNode) 
                {
                    ans = current.data;
                    break; 
                }
                count++; 
                current = current.next; 
            }
            return ans;
        }
    }
      
    // Driver code
    public static void Main(String[] args) 
    {
        // create linked list
        // 1->2->3->4->5->6->7 
        LinkedList ll = new LinkedList();
        ll.push(7);
        ll.push(6);
        ll.push(5);
        ll.push(4);
        ll.push(3);
        ll.push(2);
        ll.push(1);
        Console.WriteLine(ll.printKthfromid(ll.start, 2));
    }
}
  
// This code is contributed by Rajput-Ji


输出:
2

时间复杂度:O(n),其中n是列表的长度。
辅助空间:O(1)