删除链接列表的中间部分

给定一个单链接列表,删除链接列表的中间部分。例如,如果给定的链表是1->2->3->4->5,那么链表应该修改为1->2->4->5

null

如果有偶数个节点,那么将有两个中间节点,我们需要删除第二个中间元素。例如,如果给定的链表是1->2->3->4->5->6,那么它应该被修改为1->2->3->5->6。 如果输入链表为空,则应保持为空。

如果输入链表有1个节点,则应删除该节点并返回新的头。

简单的解决方案: 其思想是首先计算链表中的节点数,然后使用简单的删除过程删除第n/2个节点。

C++14

// C++ program to delete middle
// of a linked list
#include <bits/stdc++.h>
using namespace std;
/* Link list Node */
struct Node {
int data;
struct Node* next;
};
// count of nodes
int countOfNodes( struct Node* head)
{
int count = 0;
while (head != NULL) {
head = head->next;
count++;
}
return count;
}
// Deletes middle node and returns
// head of the modified list
struct Node* deleteMid( struct Node* head)
{
// Base cases
if (head == NULL)
return NULL;
if (head->next == NULL) {
delete head;
return NULL;
}
struct Node* copyHead = head;
// Find the count of nodes
int count = countOfNodes(head);
// Find the middle node
int mid = count / 2;
// Delete the middle node
while (mid-- > 1) {
head = head->next;
}
// Delete the middle node
head->next = head->next->next;
return copyHead;
}
// A utility function to print
// a given linked list
void printList( struct Node* ptr)
{
while (ptr != NULL) {
cout << ptr->data << "->" ;
ptr = ptr->next;
}
cout << "NULL" ;
}
// Utility function to create a new node.
Node* newNode( int data)
{
struct Node* temp = new Node;
temp->data = data;
temp->next = NULL;
return temp;
}
/* Driver program to test above function*/
int main()
{
/* Start with the empty list */
struct Node* head = newNode(1);
head->next = newNode(2);
head->next->next = newNode(3);
head->next->next->next = newNode(4);
cout << "Given Linked List" ;
printList(head);
head = deleteMid(head);
cout << "Linked List after deletion of middle" ;
printList(head);
return 0;
}


JAVA

// Java program to delete middle
// of a linked list
import java.io.*;
class GFG {
/* Link list Node */
static class Node {
int data;
Node next;
}
// Utility function to create a new node.
static Node newNode( int data)
{
Node temp = new Node();
temp.data = data;
temp.next = null ;
return temp;
}
// count of nodes
static int countOfNodes(Node head)
{
int count = 0 ;
while (head != null ) {
head = head.next;
count++;
}
return count;
}
// Deletes middle node and returns
// head of the modified list
static Node deleteMid(Node head)
{
// Base cases
if (head == null )
return null ;
if (head.next == null ) {
return null ;
}
Node copyHead = head;
// Find the count of nodes
int count = countOfNodes(head);
// Find the middle node
int mid = count / 2 ;
// Delete the middle node
while (mid-- > 1 ) {
head = head.next;
}
// Delete the middle node
head.next = head.next.next;
return copyHead;
}
// A utility function to print
// a given linked list
static void printList(Node ptr)
{
while (ptr != null ) {
System.out.print(ptr.data + "->" );
ptr = ptr.next;
}
System.out.println( "NULL" );
}
/* Driver code*/
public static void main(String[] args)
{
/* Start with the empty list */
Node head = newNode( 1 );
head.next = newNode( 2 );
head.next.next = newNode( 3 );
head.next.next.next = newNode( 4 );
System.out.println( "Given Linked List" );
printList(head);
head = deleteMid(head);
System.out.println(
"Linked List after deletion of middle" );
printList(head);
}
}
// This code is contributed by rajsanghavi9.


Python3

# Python3 program to delete middle
# of a linked list
# Link list Node
class Node:
def __init__( self ):
self .data = 0
self . next = None
# Count of nodes
def countOfNodes(head):
count = 0
while (head ! = None ):
head = head. next
count + = 1
return count
# Deletes middle node and returns
# head of the modified list
def deleteMid(head):
# Base cases
if (head = = None ):
return None
if (head. next = = None ):
del head
return None
copyHead = head
# Find the count of nodes
count = countOfNodes(head)
# Find the middle node
mid = count / / 2
# Delete the middle node
while (mid > 1 ):
mid - = 1
head = head. next
# Delete the middle node
head. next = head. next . next
return copyHead
# A utility function to print
# a given linked list
def printList(ptr):
while (ptr ! = None ):
print (ptr.data, end = '->' )
ptr = ptr. next
print ( 'NULL' )
# Utility function to create a new node.
def newNode(data):
temp = Node()
temp.data = data
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 )
print ( "Given Linked List" )
printList(head)
head = deleteMid(head)
print ( "Linked List after deletion of middle" )
printList(head)
# This code is contributed by rutvik_56


C#

// C# program to delete middle of a linked list
using System;
class GfG {
/* Link list Node */
class Node {
public int data;
public Node next;
}
// count of nodes
static int countOfNodes(Node head)
{
int count = 0;
while (head != null ) {
head = head.next;
count++;
}
return count;
}
// Deletes middle node and returns
// head of the modified list
static Node deleteMid(Node head)
{
// Base cases
if (head == null )
return null ;
if (head.next == null ) {
return null ;
}
// Initialize slow and fast pointers
// to reach middle of linked list
Node copyHead = head;
// Find the count of nodes
int count = countOfNodes(head);
// Find the middle node
int mid = count / 2;
// Delete the middle node
while (mid-- > 1) {
head = head.next;
}
// Delete the middle node
head.next = head.next.next;
return copyHead;
}
// A utility function to print
// a given linked list
static void printList(Node ptr)
{
while (ptr != null ) {
Console.Write(ptr.data + "->" );
ptr = ptr.next;
}
Console.WriteLine( "NULL" );
}
// Utility function to create a new node.
static Node newNode( int data)
{
Node temp = new Node();
temp.data = data;
temp.next = null ;
return temp;
}
/* Driver code*/
public static void Main(String[] args)
{
/* Start with the empty list */
Node head = newNode(1);
head.next = newNode(2);
head.next.next = newNode(3);
head.next.next.next = newNode(4);
Console.WriteLine( "Given Linked List" );
printList(head);
head = deleteMid(head);
Console.WriteLine( "Linked List after "
+ "deletion of middle" );
printList(head);
}
}
/* This code is contributed by ShubhamSingh */


Javascript

<script>
// Javascript program to delete the
// middle of a linked list
/* Link list Node */
class Node {
constructor() {
this .data = 0;
this .next = null ;
}
}
// count of nodes
function countOfNodes(head)
{
let count = 0;
while (head != null ) {
head = head.next;
count+=1;
}
return count;
}
// Deletes middle node and returns
// head of the modified list
function deleteMid(head)
{
// Base cases
if (head == null )
return null ;
if (head.next == null ) {
return null ;
}
var copyHead = head;
// Find the count of nodes
var count = countOfNodes(head);
// Find the middle node
var mid = parseInt(count / 2);
// Delete the middle node
while (mid-- > 1) {
head = head.next;
}
// Delete the middle node
head.next = head.next.next;
return copyHead;
}
// A utility function to print
// a given linked list
function printList( ptr) {
while (ptr != null ) {
document.write(ptr.data + "->" );
ptr = ptr.next;
}
document.write( "NULL<br/>" );
}
// Utility function to create a new node.
function newNode(data) {
temp = new Node();
temp.data = data;
temp.next = null ;
return temp;
}
/* Driver code */
/* Start with the empty list */
head = newNode(1);
head.next = newNode(2);
head.next.next = newNode(3);
head.next.next.next = newNode(4);
document.write( "Given Linked List<br/>" );
printList(head);
head = deleteMid(head);
document.write(
"Linked List after deletion of middle<br/>"
);
printList(head);
// This code is contributed by Shubham singh
</script>


输出

Given Linked List1->2->3->4->NULLLinked List after deletion of middle1->2->4->NULL

复杂性分析:

  • 时间复杂性: O(n)。 需要对链表进行两次遍历
  • 辅助空间: O(1)。 不需要额外的空间。

高效的解决方案: 方法: 上述解决方案需要对链表进行两次遍历。中间节点可以通过一次遍历删除。这个想法是使用两个指针,慢速和快速。两个指针都从列表的开头开始。当快速到达终点时,慢速到达中间。这个想法与本文方法2中使用的想法相同 邮递这篇文章中的另一件事是跟踪上一个中间节点,以便删除中间节点。

下面是实现。

C++

// C++ program to delete middle
// of a linked list
#include <bits/stdc++.h>
using namespace std;
/* Link list Node */
struct Node {
int data;
struct Node* next;
};
// Deletes middle node and returns
// head of the modified list
struct Node* deleteMid( struct Node* head)
{
// Base cases
if (head == NULL)
return NULL;
if (head->next == NULL) {
delete head;
return NULL;
}
// Initialize slow and fast pointers
// to reach middle of linked list
struct Node* slow_ptr = head;
struct Node* fast_ptr = head;
// Find the middle and previous of middle.
// To store previous of slow_ptr
struct Node* prev;
while (fast_ptr != NULL
&& fast_ptr->next != NULL) {
fast_ptr = fast_ptr->next->next;
prev = slow_ptr;
slow_ptr = slow_ptr->next;
}
// Delete the middle node
prev->next = slow_ptr->next;
delete slow_ptr;
return head;
}
// A utility function to print
// a given linked list
void printList( struct Node* ptr)
{
while (ptr != NULL) {
cout << ptr->data << "->" ;
ptr = ptr->next;
}
cout << "NULL" ;
}
// Utility function to create a new node.
Node* newNode( int data)
{
struct Node* temp = new Node;
temp->data = data;
temp->next = NULL;
return temp;
}
/* Driver program to test above function*/
int main()
{
/* Start with the empty list */
struct Node* head = newNode(1);
head->next = newNode(2);
head->next->next = newNode(3);
head->next->next->next = newNode(4);
cout << "Given Linked List" ;
printList(head);
head = deleteMid(head);
cout << "Linked List after deletion of middle" ;
printList(head);
return 0;
}


JAVA

// Java program to delete the
// middle of a linked list
class GfG {
/* Link list Node */
static class Node {
int data;
Node next;
}
// Deletes middle node and returns
// head of the modified list
static Node deleteMid(Node head)
{
// Base cases
if (head == null )
return null ;
if (head.next == null ) {
return null ;
}
// Initialize slow and fast pointers
// to reach middle of linked list
Node slow_ptr = head;
Node fast_ptr = head;
// Find the middle and previous of middle.
Node prev = null ;
// To store previous of slow_ptr
while (fast_ptr != null
&& fast_ptr.next != null ) {
fast_ptr = fast_ptr.next.next;
prev = slow_ptr;
slow_ptr = slow_ptr.next;
}
// Delete the middle node
prev.next = slow_ptr.next;
return head;
}
// A utility function to print
// a given linked list
static void printList(Node ptr)
{
while (ptr != null ) {
System.out.print(ptr.data + "->" );
ptr = ptr.next;
}
System.out.println( "NULL" );
}
// Utility function to create a new node.
static Node newNode( int data)
{
Node temp = new Node();
temp.data = data;
temp.next = null ;
return temp;
}
/* Driver code*/
public static void main(String[] args)
{
/* Start with the empty list */
Node head = newNode( 1 );
head.next = newNode( 2 );
head.next.next = newNode( 3 );
head.next.next.next = newNode( 4 );
System.out.println( "Given Linked List" );
printList(head);
head = deleteMid(head);
System.out.println( "Linked List after deletion of middle" );
printList(head);
}
}
// This code is contributed by Prerna saini.


Python3

# Python3 program to delete the
# middle of a linked list
# Linked List Node
class Node:
def __init__( self , data):
self .data = data
self . next = None
# Create and handle list operations
class LinkedList:
def __init__( self ):
# Head of the list
self .head = None
# Add new node to the list end
def addToList( self , data):
newNode = Node(data)
if self .head is None :
self .head = newNode
return
last = self .head
while last. next :
last = last. next
last. next = newNode
# Returns the list in string format
def __str__( self ):
linkedListStr = ""
temp = self .head
while temp:
linkedListStr + = str (temp.data) + "->"
temp = temp. next
return linkedListStr + "NULL"
# Method deletes middle node
def deleteMid( self ):
# Base cases
if ( self .head is None or
self .head. next is None ):
return
# Initialize slow and fast pointers
# to reach middle of linked list
slow_Ptr = self .head
fast_Ptr = self .head
# Find the middle and previous of middle
prev = None
# To store previous of slow pointer
while (fast_Ptr is not None and
fast_Ptr. next is not None ):
fast_Ptr = fast_Ptr. next . next
prev = slow_Ptr
slow_Ptr = slow_Ptr. next
# Delete the middle node
prev. next = slow_Ptr. next
# Driver code
linkedList = LinkedList()
linkedList.addToList( 1 )
linkedList.addToList( 2 )
linkedList.addToList( 3 )
linkedList.addToList( 4 )
print ( "Given Linked List" )
print (linkedList)
linkedList.deleteMid()
print ( "Linked List after deletion of middle" )
print (linkedList)
# This code is contributed by Debidutta Rath


C#

// C# program to delete middle of a linked list
using System;
class GfG {
/* Link list Node */
class Node {
public int data;
public Node next;
}
// Deletes middle node and returns
// head of the modified list
static Node deleteMid(Node head)
{
// Base cases
if (head == null )
return null ;
if (head.next == null ) {
return null ;
}
// Initialize slow and fast pointers
// to reach middle of linked list
Node slow_ptr = head;
Node fast_ptr = head;
// Find the middle and previous of middle.
Node prev = null ;
// To store previous of slow_ptr
while (fast_ptr != null && fast_ptr.next != null ) {
fast_ptr = fast_ptr.next.next;
prev = slow_ptr;
slow_ptr = slow_ptr.next;
}
// Delete the middle node
prev.next = slow_ptr.next;
return head;
}
// A utility function to print
// a given linked list
static void printList(Node ptr)
{
while (ptr != null ) {
Console.Write(ptr.data + "->" );
ptr = ptr.next;
}
Console.WriteLine( "NULL" );
}
// Utility function to create a new node.
static Node newNode( int data)
{
Node temp = new Node();
temp.data = data;
temp.next = null ;
return temp;
}
/* Driver code*/
public static void Main(String[] args)
{
/* Start with the empty list */
Node head = newNode(1);
head.next = newNode(2);
head.next.next = newNode(3);
head.next.next.next = newNode(4);
Console.WriteLine( "Given Linked List" );
printList(head);
head = deleteMid(head);
Console.WriteLine( "Linked List after"
+ "deletion of middle" );
printList(head);
}
}
/* This code is contributed by 29AjayKumar */


Javascript

<script>
// Javascript program to delete the
// middle of a linked list
/* Link list Node */
class Node {
constructor() {
this .data = 0;
this .next = null ;
}
}
// Deletes middle node and returns
// head of the modified list
function deleteMid( head) {
// Base cases
if (head == null )
return null ;
if (head.next == null ) {
return null ;
}
// Initialize slow and fast pointers
// to reach middle of linked list
var slow_ptr = head;
var fast_ptr = head;
// Find the middle and previous of middle.
var prev = null ;
// To store previous of slow_ptr
while (fast_ptr != null && fast_ptr.next != null )
{
fast_ptr = fast_ptr.next.next;
prev = slow_ptr;
slow_ptr = slow_ptr.next;
}
// Delete the middle node
prev.next = slow_ptr.next;
return head;
}
// A utility function to print
// a given linked list
function printList( ptr) {
while (ptr != null ) {
document.write(ptr.data + "->" );
ptr = ptr.next;
}
document.write( "NULL<br/>" );
}
// Utility function to create a new node.
function newNode(data) {
temp = new Node();
temp.data = data;
temp.next = null ;
return temp;
}
/* Driver code */
/* Start with the empty list */
head = newNode(1);
head.next = newNode(2);
head.next.next = newNode(3);
head.next.next.next = newNode(4);
document.write( "Given Linked List<br/>" );
printList(head);
head = deleteMid(head);
document.write(
"Linked List after deletion of middle<br/>"
);
printList(head);
// This code contributed by umadevi9616
</script>


输出

Given Linked List1->2->3->4->NULLLinked List after deletion of middle1->2->4->NULL

复杂性分析:

  • 时间复杂性: O(n)。 只需要遍历链表一次
  • 辅助空间: O(1)。 因为不需要额外的空间。

-7rw?list=PLqM7alHXFySH41ZxzrPNj2pAYPOI8ITe7 本文由 皮尤斯·古普塔 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以写一篇文章,然后将文章邮寄给评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写评论

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享