2009-07-07 18 views
16

एक साधारण कोडसी # में एक लिंक्डलिस्ट <T> में एक लिंक्डलिस्ट <T> कैसे जोड़ता है?

llist1.Last.Next = llist2.First; 
llist2.First.Previous = llist1.Last; 

काम करेगा, सी # के LinkedList, सबसे पहले, अंतिम में हालांकि जाहिरा तौर पर लगता होगा, और उनके गुणों केवल जाओ कर रहे हैं।

अन्य विधि मैं के बारे में सोच सकता था

llist1.AddLast(llist2.First); 

बहरहाल, यह या तो काम नहीं करता है - यह विफल रहता है क्योंकि llist2 के पहले नोड एक लिंक्ड सूची में पहले से ही है।

क्या इसका मतलब यह है कि मुझे एक लूप रखना है जो मैन्युअल रूप से llist2 के llist2 के प्रत्येक नोड को llist1 में जोड़ना है? क्या यह लिंक्ड सूचियों की दक्षता को हराने नहीं करता ????

+0

-1 ऐसा लगता है जैसे इंटेलिजेंस आपके प्रश्न का उत्तर दे सकता था –

+0

लिंक की गई सूचियों को जोड़ना या तो बहुत आम काम नहीं लगता है; अगर मुझे दिन में वापस से मेरे डेटा संरचना पाठ्यक्रम याद हैं। सूची और लिंक्ड सूचियां एक ही चीज़ नहीं हैं। उनके पास अलग-अलग उद्देश्य हैं; इस प्रकार, व्यवहार (या इसकी कमी) समझ में आता है। –

+1

llist1.AddLast (llist2.First) काम नहीं करता है क्योंकि llist1/llist2 दोगुनी-लिंक्ड सूचियां हैं। यदि इसकी अनुमति थी, तो "पिछले" नोड को एडलास्ट को दिए गए नोड द्वारा संदर्भित किया जाएगा? यह इस कारण से दो सूचियों का सदस्य नहीं हो सकता है। –

उत्तर

7
llist1 = new LinkedList<T>(llist1.Concat(llist2)); 

इस दो सूचियों (.NET 3.5 की आवश्यकता है) कोनकैटेनेट्स किया गया। दोष यह है कि यह LinkedList का एक नया उदाहरण के लिए, आप क्या चाहते हैं जो नहीं हो सकता है बनाता है ... आपको लगता है कि बजाय की तरह कुछ कर सकता है:

foreach(var item in llist2) 
{ 
    llist1.AddLast(item); 
} 
+0

क्या यह लिंक्ड सूचियों के लिए सही काम करता है? या क्या यह डिफ़ॉल्ट पुनरावृत्ति-ओवर-सब कुछ विधि का उपयोग करता है? – Jimmy

+0

यह इटारेट-ओवर-सब कुछ विधि करता है। –

+0

llist1 पर पुनरावृत्ति से बचने के लिए मेरा अद्यतन उत्तर देखें (आपको अभी भी llist2 पर फिर से शुरू करना होगा ...) –

15

हाँ, आप पाश करने के लिए है, दुर्भाग्य से। यह प्रत्येक प्रविष्टि के लिए एक ओ (एन) ऑपरेशन - ओ (1) है। वहाँ एक बफर की आवश्यकता होती है का कोई खतरा नहीं आकार दिया है करने के लिए जा और की नकल की, आदि - हालांकि निश्चित रूप से कचरा संग्रहण मोटे तौर पर कर सकते हैं कि :) तुम भी काम विस्तार तरीकों लिख सकते हैं:

public static class LinkedListExtensions 
{ 
    public static void AppendRange<T>(this LinkedList<T> source, 
             IEnumerable<T> items) 
    { 
     foreach (T item in items) 
     { 
      source.AddLast(item); 
     } 
    } 

    public static void PrependRange<T>(this LinkedList<T> source, 
             IEnumerable<T> items) 
    { 
     LinkedListNode<T> first = source.First; 
     foreach (T item in items) 
     { 
      source.AddBefore(first, item); 
     } 
    } 
} 

संपादित करें: एरिक की टिप्पणी से पता चलता है कि क्यों आप सोच सकते हैं यह अक्षम है - पहली सूची की पूंछ के "अगले" सूचक और दूसरे के सिर के "पिछला" सूचक को अद्यतन करके दोनों सूचियों में शामिल क्यों न हों? खैर, दूसरी सूची के साथ क्या होगा ... यह भी बदल गया होगा।

इतना ही नहीं, लेकिन उन नोड्स के स्वामित्व के साथ क्या होगा? प्रत्येक अनिवार्य रूप से दो सूचियों का हिस्सा है ... लेकिन LinkedListNode<T>.List संपत्ति केवल उनमें से किसी एक के बारे में बात कर सकती है।

जबकि मैं देख सकता हूं कि आप कुछ मामलों में ऐसा क्यों करना चाहते हैं, जिस तरह से .NET LinkedList<T> प्रकार मूल रूप से प्रतिबंधित किया गया है। मुझे लगता है कि इस दस्तावेज़ के टिप्पणी यह ​​सबसे अच्छा बताते हैं:

LinkedList<T>) वर्ग चेनिंग, बंटवारे, चक्र, या अन्य सुविधाओं है कि एक असंगत राज्य में सूची छोड़ सकते हैं समर्थन नहीं करता।

+1

के माध्यम से नहीं किया जा सकता मुझे लगता है कि वह एक कार्रवाई करते समय की दक्षता (हेरफेर "संकेत" का अर्थ है एक सूची को दूसरे में जोड़ने के लिए) बनाम बनाम किसी भी की सभी प्रविष्टियों पर। ओ (1) बनाम ओ (एन) संलग्न ऑपरेशन के लिए। –

+0

पॉइंटर्स को मैनिपुलेट करने से सीधे दूसरी सूची तोड़ जाएगी। –

+0

क्या आप स्पष्टीकरण दे सकते हैं जब आप कहते हैं कि पुनरावृत्ति और संलग्न करना ओ (1) है? यह मेरे लिए सही नहीं लगता है। मुझे लगता है कि एक आइटम को जोड़ना ओ (1) है, लेकिन एन वस्तुओं पर पुनरावृत्ति ओ (एन) है। –

4

यहां आप ओ (1) कॉन्सट और स्प्लिट टाइम्स के साथ मेरी लिंक्ड सूची कार्यान्वयन पा सकते हैं।

Why .NET LinkedList does not support Concat and Split operations?

संक्षिप्त सारांश

लाभ बनाम।नेट LinkedList:

  • कम स्मृति की खपत है, इस प्रकार प्रत्येक नोड SimpleLinkedListNode तीन संकेत है (पिछला, अगला, मूल्य) चार (पिछला, अगला, सूची, मूल्य) मूल नेट कार्यान्वयन के विपरीत के बजाय।

  • हे में Concat और स्प्लिट संचालन का समर्थन करता है (1)

  • का समर्थन करता है में IEnumarable रिवर्स() प्रगणक हे (1) - जिस तरह से मैं किसी भी कारण है कि यह देशी रूप पर से उपलब्ध नहीं है नहीं दिख रहा है द्वारा .NET LinkedList। उचित विस्तार विधि के लिए ओ (एन) की आवश्यकता है।

नुकसान:

  • गणना का समर्थन नहीं करता।
  • कंसट ऑपरेशन एक असंगत स्थिति में दूसरी सूची छोड़ देता है।
  • स्प्लिट ऑपरेशन एक असंगत स्थिति में मूल सूची छोड़ देता है।
  • आप सूचियों के बीच नोड्स साझा करने में सक्षम हैं।

अन्य:

  • मैं गणन को लागू करने और संचालन मिल जाए, बल्कि अधिक वर्बोज़ और विशुद्ध रूप से पठनीय मूल कार्यान्वयन से के लिए एक वैकल्पिक रणनीति को चुना है। मुझे आशा है कि नकारात्मक प्रदर्शन प्रभाव महत्वहीन रहेगा।
+3

'काउंटर का समर्थन नहीं करता है। 'कम से कम कार्यान्वयन करें ताकि कथन बन जाए' ओ (1)' में गणना का समर्थन नहीं करता है :) – nawfal

संबंधित मुद्दे