用于在链表中插入节点的Java程序
我们在上一篇文章中介绍了链表。我们还创建了一个包含 3 个节点的简单链表并讨论了链表遍历。
这篇文章中讨论的所有程序都考虑了链表的以下表示。
Java
// Linked List Class
class LinkedList
{
// Head of list
Node head;
// Node Class
class Node
{
int data;
Node next;
// Constructor to create
// a new node
Node(int d)
{
data = d;
next = null;
}
}
}
Java
/* This function is in LinkedList class. Inserts a
new Node at front of the list. This method is
defined inside LinkedList class shown above */
public void push(int new_data)
{
/* 1 & 2: Allocate the Node &
Put in the data*/
Node new_node = new Node(new_data);
// 3. Make next of new Node as head
new_node.next = head;
// 4. Move the head to point to
// new Node
head = new_node;
}
Java
/* This function is in LinkedList class.
Inserts a new node after the given
prev_node. This method is defined
inside LinkedList class shown above */
public void insertAfter(Node prev_node,
int new_data)
{
// 1. Check if the given Node is null
if (prev_node == null)
{
System.out.println(
"The given previous node cannot be null");
return;
}
/* 2. Allocate the Node &
3. Put in the data*/
Node new_node = new Node(new_data);
// 4. Make next of new Node as next
// of prev_node
new_node.next = prev_node.next;
// 5. make next of prev_node as new_node
prev_node.next = new_node;
}
Java
/* Appends a new node at the end. This method is
defined inside LinkedList class shown above */
public void append(int new_data)
{
/* 1. Allocate the Node &
2. Put in the data
3. Set next as null */
Node new_node = new Node(new_data);
/* 4. If the Linked List is empty, then
make the new node as head */
if (head == null)
{
head = new Node(new_data);
return;
}
/* 4. This new node is going to be the
last node, so make next of it
as null */
new_node.next = null;
// 5. Else traverse till the last node
Node last = head;
while (last.next != null)
last = last.next;
// 6. Change the next of last node
last.next = new_node;
return;
}
Java
// A complete working Java program to
// demonstrate all insertion methods
// on linked list
class LinkedList
{
// head of list
Node head;
// Linked list Node
class Node
{
int data;
Node next;
Node(int d)
{
data = d;
next = null;
}
}
// Inserts a new Node at front
// of the list.
public void push(int new_data)
{
/* 1 & 2: Allocate the Node &
Put in the data*/
Node new_node = new Node(new_data);
// 3. Make next of new Node as head
new_node.next = head;
// 4. Move the head to point to
// new Node
head = new_node;
}
// Inserts a new node after the
// given prev_node.
public void insertAfter(Node prev_node,
int new_data)
{
// 1. Check if the given Node is null
if (prev_node == null)
{
System.out.println(
"The given previous node cannot be null");
return;
}
/* 2 & 3: Allocate the Node &
Put in the data*/
Node new_node = new Node(new_data);
// 4. Make next of new Node as next
// of prev_node
new_node.next = prev_node.next;
// 5. make next of prev_node as
// new_node
prev_node.next = new_node;
}
/* Appends a new node at the end.
This method is defined inside
LinkedList class shown above */
public void append(int new_data)
{
/* 1. Allocate the Node &
2. Put in the data
3. Set next as null */
Node new_node = new Node(new_data);
/* 4. If the Linked List is empty,
then make the new node as head */
if (head == null)
{
head = new Node(new_data);
return;
}
/* 4. This new node is going to be
the last node, so make next
of it as null */
new_node.next = null;
// 5. Else traverse till the last node
Node last = head;
while (last.next != null)
last = last.next;
// 6. Change the next of last node
last.next = new_node;
return;
}
/* This function prints contents of
linked list starting from the
given node */
public void printList()
{
Node tnode = head;
while (tnode != null)
{
System.out.print(tnode.data + " ");
tnode = tnode.next;
}
}
// Driver code
public static void main(String[] args)
{
// Start with the empty list
LinkedList llist = new LinkedList();
// Insert 6. So linked list
// becomes 6->NUllist
llist.append(6);
// Insert 7 at the beginning.
// So linked list becomes
// 7->6->NUllist
llist.push(7);
// Insert 1 at the beginning.
// So linked list becomes
// 1->7->6->NUllist
llist.push(1);
// Insert 4 at the end.
// So linked list becomes
// 1->7->6->4->NUllist
llist.append(4);
// Insert 8, after 7. So linked
// list becomes
// 1->7->8->6->4->NUllist
llist.insertAfter(llist.head.next, 8);
System.out.println(
"Created Linked list is: ");
llist.printList();
}
}
// This code is contributed by Rajat Mishra
在这篇文章中,讨论了在链表中插入新节点的方法。可以通过三种方式添加节点
1)在链表的前面
2)在给定节点之后。
3)在链表的末尾。
在前面添加一个节点:(4步过程)
新节点总是添加在给定链表的头部之前。新添加的节点成为链表的新头。例如,如果给定的链表是 10->15->20->25,我们在前面添加一个项目 5,那么链表变为 5->10->15->20->25。让我们将添加到列表前面的函数称为 push()。 push() 必须接收指向头指针的指针,因为 push 必须更改头指针以指向新节点(请参阅this)
以下是在前面添加节点的 4 个步骤。
Java
/* This function is in LinkedList class. Inserts a
new Node at front of the list. This method is
defined inside LinkedList class shown above */
public void push(int new_data)
{
/* 1 & 2: Allocate the Node &
Put in the data*/
Node new_node = new Node(new_data);
// 3. Make next of new Node as head
new_node.next = head;
// 4. Move the head to point to
// new Node
head = new_node;
}
push() 的时间复杂度是 O(1),因为它做的工作量是恒定的。
在给定节点之后添加一个节点:(5个步骤)
我们得到一个指向节点的指针,新节点插入到给定节点之后。
Java
/* This function is in LinkedList class.
Inserts a new node after the given
prev_node. This method is defined
inside LinkedList class shown above */
public void insertAfter(Node prev_node,
int new_data)
{
// 1. Check if the given Node is null
if (prev_node == null)
{
System.out.println(
"The given previous node cannot be null");
return;
}
/* 2. Allocate the Node &
3. Put in the data*/
Node new_node = new Node(new_data);
// 4. Make next of new Node as next
// of prev_node
new_node.next = prev_node.next;
// 5. make next of prev_node as new_node
prev_node.next = new_node;
}
insertAfter() 的时间复杂度是 O(1),因为它做的工作量是恒定的。
最后添加一个节点:(6步过程)
新节点总是添加在给定链表的最后一个节点之后。例如,如果给定的链表是 5->10->15->20->25 并且我们在末尾添加了一个项目 30,那么链表变为 5->10->15->20->25- >30。
由于链接列表通常由其头部表示,因此我们必须遍历列表直到最后,然后将倒数第二个节点更改为新节点。
以下是最后添加节点的 6 个步骤。
Java
/* Appends a new node at the end. This method is
defined inside LinkedList class shown above */
public void append(int new_data)
{
/* 1. Allocate the Node &
2. Put in the data
3. Set next as null */
Node new_node = new Node(new_data);
/* 4. If the Linked List is empty, then
make the new node as head */
if (head == null)
{
head = new Node(new_data);
return;
}
/* 4. This new node is going to be the
last node, so make next of it
as null */
new_node.next = null;
// 5. Else traverse till the last node
Node last = head;
while (last.next != null)
last = last.next;
// 6. Change the next of last node
last.next = new_node;
return;
}
追加的时间复杂度是 O(n),其中 n 是链表中的节点数。由于从头到尾有一个循环,因此该函数执行 O(n) 工作。
通过保留一个指向链表尾部的额外指针,还可以优化此方法以在 O(1) 中工作/
下面是一个完整的程序,它使用上述所有方法来创建一个链表。
Java
// A complete working Java program to
// demonstrate all insertion methods
// on linked list
class LinkedList
{
// head of list
Node head;
// Linked list Node
class Node
{
int data;
Node next;
Node(int d)
{
data = d;
next = null;
}
}
// Inserts a new Node at front
// of the list.
public void push(int new_data)
{
/* 1 & 2: Allocate the Node &
Put in the data*/
Node new_node = new Node(new_data);
// 3. Make next of new Node as head
new_node.next = head;
// 4. Move the head to point to
// new Node
head = new_node;
}
// Inserts a new node after the
// given prev_node.
public void insertAfter(Node prev_node,
int new_data)
{
// 1. Check if the given Node is null
if (prev_node == null)
{
System.out.println(
"The given previous node cannot be null");
return;
}
/* 2 & 3: Allocate the Node &
Put in the data*/
Node new_node = new Node(new_data);
// 4. Make next of new Node as next
// of prev_node
new_node.next = prev_node.next;
// 5. make next of prev_node as
// new_node
prev_node.next = new_node;
}
/* Appends a new node at the end.
This method is defined inside
LinkedList class shown above */
public void append(int new_data)
{
/* 1. Allocate the Node &
2. Put in the data
3. Set next as null */
Node new_node = new Node(new_data);
/* 4. If the Linked List is empty,
then make the new node as head */
if (head == null)
{
head = new Node(new_data);
return;
}
/* 4. This new node is going to be
the last node, so make next
of it as null */
new_node.next = null;
// 5. Else traverse till the last node
Node last = head;
while (last.next != null)
last = last.next;
// 6. Change the next of last node
last.next = new_node;
return;
}
/* This function prints contents of
linked list starting from the
given node */
public void printList()
{
Node tnode = head;
while (tnode != null)
{
System.out.print(tnode.data + " ");
tnode = tnode.next;
}
}
// Driver code
public static void main(String[] args)
{
// Start with the empty list
LinkedList llist = new LinkedList();
// Insert 6. So linked list
// becomes 6->NUllist
llist.append(6);
// Insert 7 at the beginning.
// So linked list becomes
// 7->6->NUllist
llist.push(7);
// Insert 1 at the beginning.
// So linked list becomes
// 1->7->6->NUllist
llist.push(1);
// Insert 4 at the end.
// So linked list becomes
// 1->7->6->4->NUllist
llist.append(4);
// Insert 8, after 7. So linked
// list becomes
// 1->7->8->6->4->NUllist
llist.insertAfter(llist.head.next, 8);
System.out.println(
"Created Linked list is: ");
llist.printList();
}
}
// This code is contributed by Rajat Mishra
输出:
Created Linked list is: 1 7 8 6 4
请参阅链表上的完整文章 |设置 2(插入节点)了解更多详情!