链表 - 使用 C# 在链表中进行奇偶排序
本文关键字:链表 奇偶 排序 使用 | 更新日期: 2023-09-27 17:55:24
一段早期的工作代码被某人更改了,现在它给出了错误。当我推送时,它总是有空节点。有人可以指导吗?
push
方法中,它总是传递空值。
using System;
/* a node of the singly linked list */
public class node
{
public int data;
public node next;
}
public static class GlobalMembers
{
public static void segregateEvenOdd(node head_ref)
{
node end = head_ref;
node prev = null;
node curr = head_ref;
/* Get pointer to the last node */
while (end.next != null)
{
end = end.next;
}
node new_end = end;
/* Consider all odd nodes before the first even node
and move then after end */
while (curr.data % 2 != 0 && curr != end)
{
new_end.next = curr;
curr = curr.next;
new_end.next.next = null;
new_end = new_end.next;
}
// 10->8->17->17->15
/* Do following steps only if there is any even node */
if (curr.data % 2 == 0)
{
/* Change the head pointer to point to first even node */
head_ref = curr;
/* now current points to the first even node */
while (curr != end)
{
if ((curr.data) % 2 == 0)
{
prev = curr;
curr = curr.next;
}
else
{
/* break the link between prev and current */
prev.next = curr.next;
/* Make next of curr as NULL */
curr.next = null;
/* Move curr to end */
new_end.next = curr;
/* make curr as new end of list */
new_end = curr;
/* Update current pointer to next of the moved node */
curr = prev.next;
}
}
}
/* We must have prev set before executing lines following this
statement */
else
{
prev = curr;
}
/* If there are more than 1 odd nodes and end of original list is
odd then move this node to end to maintain same order of odd
numbers in modified list */
if (new_end != end && (end.data) % 2 != 0)
{
prev.next = end.next;
end.next = null;
new_end.next = end;
}
return;
}
public static void push(node head_ref, int new_data)
{
node new_node =new node();// = (node) malloc(sizeof(node));
new_node.data = new_data;
/* link the old list off the new node */
new_node.next = head_ref;
/* move the head to point to the new node */
head_ref = new_node;
}
/* Function to print nodes in a given linked list */
public static void printList(node node)
{
while (node != null)
{
Console.Write("{0:D} ", node.data);
node = node.next;
}
}
/* Drier program to test above functions*/
static int Main()
{
node head = null;
/* Let us create a sample linked list as following
0->2->4->6->8->10->11 */
push(head, 11);
push(head, 10);
push(head, 8);
push(head, 6);
push(head, 4);
push(head, 2);
push(head, 0);
Console.Write("'nOriginal Linked list 'n");
printList(head);
segregateEvenOdd(head);
Console.Write("'nModified Linked list 'n");
printList(head);
return 0;
}
}
像这样更改列表:
public static node push(node head_ref, int new_data) {
node new_node = new node(); // = (node) malloc(sizeof(node));
new_node.data = new_data;
/* link the old list off the new node */
new_node.next = head_ref;
/* move the head to point to the new node */
head_ref = new_node;
return head_ref;
}
static int Main()
{
node head = null;
/* Let us create a sample linked list as following
0->2->4->6->8->10->11 */
head = push(head, 11);