Reversing single linked list in C#

后端 未结 13 661
说谎
说谎 2020-12-07 17:02

I am trying to reverse a linked list. This is the code I have come up with:

 public static void Reverse(ref Node root)
 {
      Node tmp = root;
      Node n         


        
相关标签:
13条回答
  • 2020-12-07 17:19

    linked list reversal recursive

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ReverseLinkedList
    {
        class Program
        {
            static void Main(string[] args)
            {
                Node head = null;
                LinkedList.Append(ref head, 25);
                LinkedList.Append(ref head, 5);
                LinkedList.Append(ref head, 18);
                LinkedList.Append(ref head, 7);
    
                Console.WriteLine("Linked list:");
                LinkedList.Print(head);
    
                Console.WriteLine();
                Console.WriteLine("Reversed Linked list:");
                LinkedList.Reverse(ref head);
                LinkedList.Print(head);
    
                Console.WriteLine();
                Console.WriteLine("Reverse of Reversed Linked list:");
                LinkedList.ReverseUsingRecursion(head);
                head = LinkedList.newHead;
                LinkedList.PrintRecursive(head);
            }
    
            public static class LinkedList
            {
                public static void Append(ref Node head, int data)
                {
                    if (head != null)
                    {
                        Node current = head;
                        while (current.Next != null)
                        {
                            current = current.Next;
                        }
    
                        current.Next = new Node();
                        current.Next.Data = data;
                    }
                    else
                    {
                        head = new Node();
                        head.Data = data;
                    }
                }
    
                public static void Print(Node head)
                {
                    if (head == null) return;
                    Node current = head;
                    do
                    {
                        Console.Write("{0} ", current.Data);
                        current = current.Next;
                    } while (current != null);
                }
    
                public static void PrintRecursive(Node head)
                {
                    if (head == null)
                    {
                        Console.WriteLine();
                        return;
                    }
                    Console.Write("{0} ", head.Data);
                    PrintRecursive(head.Next);
                }
    
                public static void Reverse(ref Node head)
                {
                    if (head == null) return;
                    Node prev = null, current = head, next = null;
                    while (current.Next != null)
                    {
                        next = current.Next;
                        current.Next = prev;
                        prev = current;
                        current = next;
                    }
                    current.Next = prev;
                    head = current;
                }
    
                public static Node newHead;
    
                public static void ReverseUsingRecursion(Node head)
                {
                    if (head == null) return;
                    if (head.Next == null)
                    {
                        newHead = head;
                        return;
                    }
    
                    ReverseUsingRecursion(head.Next);
                    head.Next.Next = head;
                    head.Next = null;
                }
            }
    
            public class Node
            {
                public int Data = 0;
                public Node Next = null;
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-07 17:27
    Node p = root, n = null;
    while (p != null) {
        Node tmp = p.next;
        p.next = n;
        n = p;
        p = tmp;
    }
    root = n;
    
    0 讨论(0)
  • 2020-12-07 17:31

    Here a sample code to reverse a linked list.

    using System;

    class Program
    {
        static void Main(string[] args)
        {
            LinkItem item = generateLinkList(5);
            printLinkList(item);
            Console.WriteLine("Reversing the list ...");
            LinkItem newItem = reverseLinkList(item);
            printLinkList(newItem);
            Console.ReadLine();
        }
    
        static public LinkItem generateLinkList(int total)
        {
            LinkItem item = new LinkItem();
            for (int number = total; number >=1; number--)
            {
                item = new LinkItem
                {
                    name = string.Format("I am the link item number {0}.", number),
                    next = (number == total) ? null : item
                };
            }
            return item;
        }
    
        static public void printLinkList(LinkItem item)
        {
            while (item != null)
            {
                Console.WriteLine(item.name);
                item = item.next;
            }
        }
    
        static public LinkItem reverseLinkList(LinkItem item)
        {
            LinkItem newItem = new LinkItem
            {
                name = item.name,
                next = null
            };
    
            while (item.next != null)
            {
                newItem = new LinkItem
                {
                    name = item.next.name,
                    next = newItem
                };
    
                item = item.next;
            }
    
            return newItem;
        }
    }
    
    class LinkItem
    {
        public string name;
        public LinkItem next;
    }
    
    0 讨论(0)
  • 2020-12-07 17:35

    You don't need to make a copy. Some pseudo code:

    prev = null;
    current = head;
    next = current->next;
    
    (while next != null)
        current->next=prev
        prev=current
        current=next
        next=current->next
    
    0 讨论(0)
  • 2020-12-07 17:35

    This performed pretty well on Leetcode.

    public ListNode ReverseList(ListNode head) {
    
            ListNode previous = null;
            ListNode current = head; 
            while(current != null) {
                ListNode nextTemp = current.next;
                current.next = previous;
                previous = current;
                current = nextTemp;
            }
    
            return previous;
        }     
    
    0 讨论(0)
  • 2020-12-07 17:37

    Years ago I missed out on a hipster-L.A.-entertainment-company ASP.NET MVC developer position because I could not answer this question :( (It's a way to weed out non-computer-science majors.) So I am embarrassed to admit that it took me way too long to figure this out in LINQpad using the actual LinkedList<T>:

    var linkedList = new LinkedList<int>(new[]{1,2,3,4,5,6,7,8,9,10});
    linkedList.Dump("initial state");
    
    var head = linkedList.First;
    while (head.Next != null)
    {
        var next = head.Next;
        linkedList.Remove(next);
        linkedList.AddFirst(next.Value);
    }
    
    linkedList.Dump("final state");
    

    The read-only LinkedListNode<T>.Next property is what makes LinkedList<T> so important here. (Non-comp-sci people are encouraged to study the history of Data Structures---we are supposed to ask the question, Where does the linked list come from---why does it exist?)

    0 讨论(0)
提交回复
热议问题