هذا هو السؤال المفضل الذي يجب طرحه للمطورين الجدد. بسيط جدًا إذا كان لديك فئة هياكل بيانات جيدة.
عكس قائمة مرتبطة واحدة. (هذا هو Leetcode 206)
بالنسبة للتنفيذ، اخترت أن أجعل القائمة المرتبطة نوعًا عامًا.
type Node[T any] struct { Data T Next *Node[T] } type LinkedList[T any] struct { Head *Node[T] } func (ll *LinkedList[T]) Append(data T) { newNode := &Node[T]{Data: data, Next: nil} if ll.Head == nil { ll.Head = newNode return } current := ll.Head for current.Next != nil { current = current.Next } current.Next = newNode }
وبالنسبة للوظيفة العكسية، يتم ذلك بتمرير واحد من خلال إدراك أن كل ما يتعين علينا القيام به هو الحفاظ على مؤشر للعقدة السابقة، ثم تعيين "التالى" للعقدة المحددة إلى العقدة السابقة.
عندما نصل إلى النهاية، نعلم أن العقدة الحالية هي "الرأس" الجديد للقائمة.
func (ll *LinkedList[T]) ReverseLinkedList() { var prev *Node[T] = nil var ptr *Node[T] = ll.Head for ptr != nil { var next *Node[T] = ptr.Next ptr.Next = prev prev = ptr if next == nil { ll.Head = ptr } ptr = next } }
هل فاتنا شرط حدودي؟ ما هي المضاعفات التي تتم إضافتها إذا أصبحت القائمة الآن قائمة مرتبطة بشكل مزدوج؟ اسمحوا لي أن نعرف في التعليقات.
شكرًا!
يمكن العثور على رمز هذه المشاركة وجميع المشاركات في هذه السلسلة هنا
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3