# 算法：将所有出现的元素移动到链表的结尾

2021年3月17日14:10:49 发表评论 379 次浏览

## 本文概述

``````Input  : 1 -> 2 -> 2 -> 4 -> 3
key = 2
Output : 1 -> 4 -> 3 -> 2 -> 2

Input  : 6 -> 6 -> 7 -> 6 -> 3 -> 10
key = 6
Output : 7 -> 3 -> 10 -> 6 -> 6 -> 6``````

## 推荐：请尝试以下方法{IDE}首先, 在继续解决方案之前。

=>用于遍历整个列表的指针。

=>如果找到了密钥, 则指向发生密钥的指针。其他与pCrawl相同。

## C ++

``````// C++ program to move all occurrences of a
// given key to end.
#include <bits/stdc++.h>

struct Node {
int data;
struct Node* next;
};

// A urility function to create a new node.
struct Node* newNode( int x)
{
Node* temp = new Node;
temp->data = x;
temp->next = NULL;
}

// Utility function to print the elements
{
while (temp != NULL) {
printf ( "%d " , temp->data);
temp = temp->next;
}
printf ( "\n" );
}

// Moves all occurrences of given key to
{
// Keeps track of locations where key
// is present.

// Traverse list
while (pCrawl != NULL) {
// If current pointer is not same as pointer
// to a key location, then we must have found
// a key in linked list. We swap data of pCrawl
// and pKey and move pKey to next position.
if (pCrawl != pKey && pCrawl->data != key) {
pKey->data = pCrawl->data;
pCrawl->data = key;
pKey = pKey->next;
}

// Find next position where key is present
if (pKey->data != key)
pKey = pKey->next;

// Moving to next Node
pCrawl = pCrawl->next;
}
}

// Driver code
int main()
{

printf ( "Before moveToEnd(), the Linked list is\n" );

int key = 10;

printf ( "\nAfter moveToEnd(), the Linked list is\n" );

return 0;
}``````

## Java

``````// Java program to move all occurrences of a
// given key to end.
class GFG {

static class Node {
int data;
Node next;
}

// A urility function to create a new node.
static Node newNode( int x)
{
Node temp = new Node();
temp.data = x;
temp.next = null ;
return temp;
}

// Utility function to print the elements
{
while (temp != null ) {
System.out.printf( "%d " , temp.data);
temp = temp.next;
}
System.out.printf( "\n" );
}

// Moves all occurrences of given key to
static void moveToEnd(Node head, int key)
{
// Keeps track of locations where key
// is present.

// Traverse list
while (pCrawl != null ) {
// If current pointer is not same as pointer
// to a key location, then we must have found
// a key in linked list. We swap data of pCrawl
// and pKey and move pKey to next position.
if (pCrawl != pKey && pCrawl.data != key) {
pKey.data = pCrawl.data;
pCrawl.data = key;
pKey = pKey.next;
}

// Find next position where key is present
if (pKey.data != key)
pKey = pKey.next;

// Moving to next Node
pCrawl = pCrawl.next;
}
}

// Driver code
public static void main(String args[])
{
Node head = newNode( 10 );

System.out.printf( "Before moveToEnd(), the Linked list is\n" );

int key = 10 ;

System.out.printf( "\nAfter moveToEnd(), the Linked list is\n" );
}
}

// This code is contributed by Arnab Kundu``````

## python

``````# Python program to move all occurrences of a
# given key to end.

class Node:
def __init__( self , data):
self .data = data
self . next = None

# A urility function to create a new node.
def newNode(x):

temp = Node( 0 )
temp.data = x
temp. next = None
return temp

# Utility function to print the elements

while (temp ! = None ) :
print ( temp.data, end = " " )
temp = temp. next

print ()

# Moves all occurrences of given key to

# Keeps track of locations where key
# is present.

# Traverse list
while (pCrawl ! = None ) :

# If current pointer is not same as pointer
# to a key location, then we must have found
# a key in linked list. We swap data of pCrawl
# and pKey and move pKey to next position.
if (pCrawl ! = pKey and pCrawl.data ! = key) :
pKey.data = pCrawl.data
pCrawl.data = key
pKey = pKey. next

# Find next position where key is present
if (pKey.data ! = key):
pKey = pKey. next

# Moving to next Node
pCrawl = pCrawl. next

# Driver code
head. next = newNode( 20 )
head. next . next = newNode( 10 )
head. next . next . next = newNode( 30 )
head. next . next . next . next = newNode( 40 )
head. next . next . next . next . next = newNode( 10 )
head. next . next . next . next . next . next = newNode( 60 )

print ( "Before moveToEnd(), the Linked list is\n" )

key = 10

print ( "\nAfter moveToEnd(), the Linked list is\n" )

# This code is contributed by Arnab Kundu``````

## C#

``````// C# program to move all occurrences of a
// given key to end.
using System;

class GFG {

public class Node {
public int data;
public Node next;
}

// A urility function to create a new node.
static Node newNode( int x)
{
Node temp = new Node();
temp.data = x;
temp.next = null ;
return temp;
}

// Utility function to print the elements
{
while (temp != null ) {
Console.Write( "{0} " , temp.data);
temp = temp.next;
}
Console.Write( "\n" );
}

// Moves all occurrences of given key to
static void moveToEnd(Node head, int key)
{
// Keeps track of locations where key
// is present.

// Traverse list
while (pCrawl != null ) {
// If current pointer is not same as pointer
// to a key location, then we must have found
// a key in linked list. We swap data of pCrawl
// and pKey and move pKey to next position.
if (pCrawl != pKey && pCrawl.data != key) {
pKey.data = pCrawl.data;
pCrawl.data = key;
pKey = pKey.next;
}

// Find next position where key is present
if (pKey.data != key)
pKey = pKey.next;

// Moving to next Node
pCrawl = pCrawl.next;
}
}

// Driver code
public static void Main(String[] args)
{

Console.Write( "Before moveToEnd(), the Linked list is\n" );

int key = 10;

Console.Write( "\nAfter moveToEnd(), the Linked list is\n" );
}
}

// This code has been contributed by 29AjayKumar``````

``````Before moveToEnd(), the Linked list is
10 20 10 30 40 10 60

After moveToEnd(), the Linked list is
20 30 40 60 10 10 10``````

1.遍历链接列表, 并在末尾指向一个指针。

2.现在, 检查密钥和node-> data, 如果它们相等, 则将节点移至last-next, 否则移至

## C ++

``````// C++ code to remove key element to end of linked list
#include<bits/stdc++.h>
using namespace std;

struct Node
{
int data;
struct Node* next;
};

// A urility function to create a new node.
struct Node* newNode( int x)
{
Node* temp = new Node;
temp->data = x;
temp->next = NULL;
}

// Function to remove key to end
{

// Node to keep pointing to tail
{
return NULL;
}
while (tail->next != NULL)
{
tail = tail->next;
}

// Node to point to last of linked list
Node* last = tail;
Node* prev = NULL;

// Node prev2 to point to previous when head.data!=key
Node* prev2 = NULL;

// loop to perform operations to remove key to end
while (current != tail)
{
if (current->data == key && prev2 == NULL)
{
prev = current;
current = current->next;
last->next = prev;
last = last->next;
last->next = NULL;
prev = NULL;
}
else
{
if (current->data == key && prev2 != NULL)
{
prev = current;
current = current->next;
prev2->next = current;
last->next = prev;
last = last->next;
last->next = NULL;
}
else if (current != tail)
{
prev2 = current;
current = current->next;
}
}
}
}

// Function to display linked list
{
while (temp != NULL)
{
printf ( "%d " , temp->data);
temp = temp->next;
}
printf ( "\n" );
}

// Driver Code
int main()
{
Node* root = newNode(5);
root->next = newNode(2);
root->next->next = newNode(2);
root->next->next->next = newNode(7);
root->next->next->next->next = newNode(2);
root->next->next->next->next->next = newNode(2);
root->next->next->next->next->next->next = newNode(2);

int key = 2;
cout << "Linked List before operations :" ;
printList(root);
cout << "\nLinked List after operations :" ;
root = keyToEnd(root, key);
printList(root);
return 0;
}

// This code is contributed by Rajout-Ji``````

## Java

``````// Java code to remove key element to end of linked list
import java.util.*;

// Node class
class Node {
int data;
Node next;

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

class gfg {

static Node root;

// Function to remove key to end
public static Node keyToEnd(Node head, int key)
{

// Node to keep pointing to tail

if (head == null ) {
return null ;
}

while (tail.next != null ) {
tail = tail.next;
}

// Node to point to last of linked list
Node last = tail;

Node prev = null ;

// Node prev2 to point to previous when head.data!=key
Node prev2 = null ;

// loop to perform operations to remove key to end
while (current != tail) {
if (current.data == key && prev2 == null ) {
prev = current;
current = current.next;
last.next = prev;
last = last.next;
last.next = null ;
prev = null ;
}
else {
if (current.data == key && prev2 != null ) {
prev = current;
current = current.next;
prev2.next = current;
last.next = prev;
last = last.next;
last.next = null ;
}
else if (current != tail) {
prev2 = current;
current = current.next;
}
}
}
}

// Function to display linked list
public static void display(Node root)
{
while (root != null ) {
System.out.print(root.data + " " );
root = root.next;
}
}

// Driver Code
public static void main(String args[])
{
root = new Node( 5 );
root.next = new Node( 2 );
root.next.next = new Node( 2 );
root.next.next.next = new Node( 7 );
root.next.next.next.next = new Node( 2 );
root.next.next.next.next.next = new Node( 2 );
root.next.next.next.next.next.next = new Node( 2 );

int key = 2 ;
System.out.println( "Linked List before operations :" );
display(root);
System.out.println( "\nLinked List after operations :" );
root = keyToEnd(root, key);
display(root);
}
}``````

## C#

``````// C# code to remove key
// element to end of linked list
using System;

// Node class
public class Node {
public int data;
public Node next;

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

class GFG {

static Node root;

// Function to remove key to end
public static Node keyToEnd(Node head, int key)
{

// Node to keep pointing to tail

if (head == null ) {
return null ;
}

while (tail.next != null ) {
tail = tail.next;
}

// Node to point to last of linked list
Node last = tail;

Node prev = null ;

// Node prev2 to point to
Node prev2 = null ;

// loop to perform operations
// to remove key to end
while (current != tail) {
if (current.data == key && prev2 == null ) {
prev = current;
current = current.next;
last.next = prev;
last = last.next;
last.next = null ;
prev = null ;
}
else {
if (current.data == key && prev2 != null ) {
prev = current;
current = current.next;
prev2.next = current;
last.next = prev;
last = last.next;
last.next = null ;
}
else if (current != tail) {
prev2 = current;
current = current.next;
}
}
}
}

// Function to display linked list
public static void display(Node root)
{
while (root != null ) {
Console.Write(root.data + " " );
root = root.next;
}
}

// Driver Code
public static void Main()
{
root = new Node(5);
root.next = new Node(2);
root.next.next = new Node(2);
root.next.next.next = new Node(7);
root.next.next.next.next = new Node(2);
root.next.next.next.next.next = new Node(2);
root.next.next.next.next.next.next = new Node(2);

int key = 2;
Console.WriteLine( "Linked List before operations :" );
display(root);
Console.WriteLine( "\nLinked List after operations :" );
root = keyToEnd(root, key);
display(root);
}
}

// This code is contributed by PrinciRaj1992``````

``````Linked List before operations :
5 2 2 7 2 2 2