📌  相关文章
📜  将最后一个元素移动到给定链表的前面 | 2套

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

将最后一个元素移动到给定链表的前面 | 2套

给定一个单向链表和一个整数K 。任务是将链表的最后 K 个元素追加到前面。

例子:

先决条件:将最后一个元素移动到给定链表的前面



方法:

  • 循环 (k % n) 次,其中 n 是链表的元素数。
  • 每次从链表的末尾删除一个节点。
  • 同时在链表的开头插入删除的节点。

      下面是上述方法的实现:

      // CPP Program to move k last elements 
      // to front in a given linked list 
      #include
      using namespace std;
        
      // A linked list node 
      class Node
      {
          public:
            
          int data;
          Node* next;
          Node(int d) {
              data = d;
              next = NULL;
          }
      };
        
      // Function to add a new node at the
      // end/tail of Linked List 
      void insertAtTail(Node*& head, Node*& tail, int d ) {
          Node* newnode = new Node(d);
          if(tail == NULL) {
              tail = head = newnode;
              return;
          }
        
          tail->next = newnode;
          tail = newnode;
      }
        
      // Function to add a node at the
      // beginning of Linked List 
      void insertAtHead(Node*& head, Node*& tail, 
                                 Node*& deletedNode) 
      {
          if(head == NULL) {
              head = tail = deletedNode;
              return;
          }
          deletedNode->next = head;
          head = deletedNode;
          return;
      }
        
      // Function to add a node at the beginning of Linked List 
      Node* deleteAtTail(Node*& head, Node*& tail) {
          Node* deleted = tail;
          Node* temp = head;
        
          while(temp->next->next != NULL) {
              temp = temp->next;
          }
        
          temp->next = NULL;
          tail = temp;
          return deleted;
      }
        
      // k can be more than n, so this function takes the modulus 
      // of k with n and delete nodes from end k 
      // times and simultaneously insert it in front
      void appendAtFront(Node*& head, Node*& tail, int n, int k) 
      {
          k = k % n;
          while(k != 0) {
              Node* deleted = deleteAtTail(head, tail);
              insertAtHead(head, tail, deleted);
              k--;
          }
      }
        
      // Function to print nodes in a given linked list 
      void printLinkedList(Node* head) {
          while(head != NULL) {
              cout << head->data << " ";
              head = head->next;
          }
          cout << endl;
      }
        
      // Driver Code 
      int main() 
      {
          // Pointer to the start of the linked list
          Node* head = NULL;
            
          // Pointer to the end of the linked list
          Node* tail = NULL; 
            
          // Number of elements in the linked list
          int n = 6; 
            
          // Building linked list
          insertAtTail(head, tail, 1);
          insertAtTail(head, tail, 2);
          insertAtTail(head, tail, 3);
          insertAtTail(head, tail, 4);
          insertAtTail(head, tail, 5);
          insertAtTail(head, tail, 6);
            
            
          // Printing linked list before 
          // appending the linked list
          cout << "Linked List before appending: ";
          printLinkedList(head);
            
          // Number of elements to be appended
          int k = 7;
            
          // Function call
          appendAtFront(head, tail, n, k); 
            
          // Printing linked list after appending the list
          cout << "Linked List after appending "<
      输出:
      Linked List before appending: 1 2 3 4 5 6 
      Linked List after appending 7 elements: 6 1 2 3 4 5 
      

      如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程。