ایک لنک شدہ فہرست کو ریورس کریں (C++)

Ayk Lnk Shd F Rst Kw Rywrs Kry C



لنکڈ لسٹ کو C++ میں ریورس کرنے کا طریقہ اس LinuxHint ٹیوٹوریل میں دکھایا گیا ہے۔ جب آپ کسی منسلک فہرست کو ریورس کرتے ہیں، تو لنک کا راستہ الٹ جاتا ہے، اور سر دم بن جاتا ہے، اور دم سر بن جاتا ہے۔ نوڈس کی پوزیشنوں کو تبدیل کرنے سے، ہم اسے جلدی سمجھ سکتے ہیں۔ اس تبادلہ میں، ہم صرف نوڈس کی پوزیشن کو بائیں سے دائیں یا اس کے برعکس تبدیل کرتے ہیں۔

منسلک فہرست: یہ ایک منسلک فہرست ہے جسے ہم ریورس کرنا چاہتے ہیں۔







الٹ لنک شدہ فہرست کے بعد: مندرجہ بالا لنک شدہ فہرست کو تبدیل کرنے کے بعد نتیجہ ذیل میں آئے گا۔





مندرجہ بالا مثال کے خاکے میں، ہم دیکھ سکتے ہیں کہ جب ہم لنک شدہ فہرست کو ریورس کرتے ہیں تو ہیڈ نوڈ اور ٹیل نوڈ اپنی پوزیشن تبدیل کرتے ہیں۔ ہیڈ نوڈ، جو اب ٹیل نوڈ ہے، نل نوڈ کی طرف اشارہ کرتا ہے کیونکہ یہ اب ٹیل نوڈ ہے۔





الگورتھم کے اقدامات

  1. ہم ایک اہم طریقہ بناتے ہیں اور کچھ مطلوبہ متغیرات کا اعلان کرتے ہیں۔
  2. پھر، ہمارا اگلا مرحلہ ایک ایسا طریقہ بنانا ہے جو ایک لنک شدہ فہرست بنا سکے۔ یہ طریقہ ہمیں لنکڈ لسٹ بنانے میں مدد کرتا ہے۔
  3. اگلا مرحلہ منسلک فہرست کو ریورس کرنے کا طریقہ بنانا ہے۔ اس طریقہ میں، ہم پوری لنک شدہ فہرست کو پاس کرتے ہیں، اور یہ طریقہ لنک کردہ فہرست کو الٹ دے گا۔
  4. اب، ہمیں اپنا نتیجہ ریورس کرنے کے بعد ظاہر کرنے کے لیے ایک اور طریقہ کی ضرورت ہے۔
  5. ہم مندرجہ بالا ان تمام طریقوں کو اپنے مرکزی طریقہ کار میں یکجا کریں گے۔

ہم کچھ تصویری شکل کا استعمال کرتے ہوئے معکوس منسلک فہرست کی وضاحت کرنے جا رہے ہیں تاکہ اسے سمجھنے میں آسانی ہو۔ تو آئیے مثال کے ساتھ شروع کریں۔

ذیل میں ایک منسلک فہرست ہے جسے ہم ریورس کرنا چاہتے ہیں۔



مرحلہ نمبر 1 . سبز رنگ کا نوڈ ایک ہیڈ نوڈ ہے، جو آغاز میں پہلے نوڈ کی طرف اشارہ کرتا ہے۔

مرحلہ 2. اگلے مرحلے میں، ہم پوری لنک شدہ فہرست کو اس وقت تک عبور کریں گے جب تک کہ ہمیں ہیڈر نوڈ کے آگے null پوائنٹر نہ ملے۔ اس کے لیے، ہم اگلے نوڈ کو ایک عارضی نام تفویض کرنے جا رہے ہیں، جیسا کہ نیچے دیے گئے خاکے میں دکھایا گیا ہے۔

مرحلہ 3۔ جیسا کہ ہمارے پاس 'عارضی' کے نام سے ایک نیا حوالہ نوڈ ہے جو ہمیں پوری لنک شدہ فہرست کو عبور کرنے میں مدد کر سکتا ہے جب تک کہ ہمیں null پوائنٹر نہیں مل جاتا، لہذا ہم ہیڈر نوڈ کے اگلے لنک کو null کے طور پر سیٹ کر سکتے ہیں، جو لنک شدہ کو متاثر نہیں کرے گا۔ فہرست جیسا کہ ذیل میں خاکہ میں دکھایا گیا ہے۔ موجودہ نوڈ کے ساتھ والے نل پوائنٹر کو پچھلا نوڈ کہا جاتا ہے۔

مرحلہ 4۔ اب، ہم عارضی نوڈ کو اگلے نوڈ میں اور موجودہ نوڈ کو پچھلے عارضی نوڈ میں منتقل کرتے ہیں۔ تو اب ہم اگلے نوڈ پر چلے گئے ہیں۔ ہم پچھلے نوڈ کو بھی null سے صرف موجودہ نوڈ کے پچھلے نوڈ میں تبدیل کرتے ہیں۔ لہذا اب عارضی نوڈ null پوائنٹر تک تمام ٹریورسز کا خیال رکھے گا تاکہ ہم موجودہ نوڈ کے لنک کو پچھلے نوڈ سے سیٹ کر سکیں، اور اب یہ پچھلے نوڈ کی طرف اشارہ کر رہا ہے، جیسا کہ نیچے دیے گئے خاکے میں دکھایا گیا ہے۔

لہذا ہم انہی مراحل کی پیروی کریں گے اور آخر کار ہمیں ایک الٹ لنک شدہ فہرست ملے گی۔

مرحلہ 5 .

مرحلہ 6۔

مرحلہ 7۔

مرحلہ 8۔

مرحلہ 9۔

مرحلہ 10۔

مرحلہ 11۔

مرحلہ 12۔

مرحلہ 13۔

مرحلہ 14۔ اس مرحلے پر، ہماری منسلک فہرست الٹ گئی۔

ایک لنک شدہ فہرست کو ریورس کرنے کے لیے C++ پروگرام

# شامل کریں
استعمال کرتے ہوئے نام کی جگہ std ;

// نوڈ بنانے کا طریقہ
ساخت نوڈ {
int قدر ;
نوڈ * NextNodePtr ;
} * nodeObject ;

باطل لنکڈ لسٹ بنائیں ( int n ) ;
باطل ریورس لنکڈ لسٹ ( نوڈ ** nodeObject ) ;
باطل ڈسپلے ( ) ;

int مرکزی ( ) {
int n، قدر، آئٹم ;
cout << 'آپ کتنے نوڈس بنانا چاہتے ہیں =>:' ;
کھانا >> n ;
لنکڈ لسٹ بنائیں ( n ) ;
cout << ' \n منسلک فہرست میں معلومات: \n ' ;
ڈسپلے ( ) ;
cout << ' \n الٹ کے بعد لنک شدہ فہرست \n ' ;
ریورس لنکڈ لسٹ ( اور nodeObject ) ;
ڈسپلے ( ) ;
واپسی 0 ;
}
// یہ طریقہ لنک شدہ فہرست بنائے گا۔
باطل لنکڈ لسٹ بنائیں ( int n ) {
ساخت نوڈ * فرنٹ نوڈ، * tempNode ;
int قدر، i ;

nodeObject = ( ساخت نوڈ * ) malloc ( کا سائز ( ساخت نوڈ ) ) ;
اگر ( nodeObject == خالی )
cout << 'یادداشت کا اندازہ لگانے کے لئے کافی نہیں ہے' ;
اور {
cout << 'براہ کرم نوڈ 1 کی معلومات درج کریں (صرف نمبر):' ;
کھانا >> قدر ;
nodeObject - > قدر = قدر ;
nodeObject - > NextNodePtr = خالی ;
tempNode = nodeObject ;

کے لیے ( میں = دو ; میں <= n ; میں ++ ) {
فرنٹ نوڈ = ( ساخت نوڈ * ) malloc ( کا سائز ( ساخت نوڈ ) ) ;

// جب منسلک فہرست میں کوئی نوڈ نہیں ہے۔
اگر ( فرنٹ نوڈ == خالی ) {
cout << 'میموری مختص نہیں کی جا سکتی' ;
توڑنا ;
}
اور {
cout << 'براہ کرم نوڈ کی معلومات درج کریں' << میں << ' :' ;
کھانا >> قدر ;
فرنٹ نوڈ - > قدر = قدر ;
فرنٹ نوڈ - > NextNodePtr = خالی ;
tempNode - > NextNodePtr = فرنٹ نوڈ ;
tempNode = tempNode - > NextNodePtr ;
}
}
}
}

باطل ریورس لنکڈ لسٹ ( نوڈ ** nodeObject ) {
ساخت نوڈ * tempNode = خالی ;
ساخت نوڈ * پچھلے نوڈ = خالی ;
ساخت نوڈ * موجودہ نوڈ = ( * nodeObject ) ;
جبکہ ( موجودہ نوڈ ! = خالی ) {
tempNode = موجودہ نوڈ - > NextNodePtr ;
موجودہ نوڈ - > NextNodePtr = پچھلے نوڈ ;
پچھلے نوڈ = موجودہ نوڈ ;
موجودہ نوڈ = tempNode ;
}
( * nodeObject ) = پچھلے نوڈ ;
}
باطل ڈسپلے ( ) {
ساخت نوڈ * tempNode ;
اگر ( nodeObject == خالی ) {
cout << 'لنکڈ لسٹ خالی ہے' ;
}
اور {
tempNode = nodeObject ;
جبکہ ( tempNode ! = خالی )
{
cout << ٹیمپ نوڈ - > قدر << ' \t ' ;
ٹیمپ نوڈ = ٹیمپ نوڈ - > NextNodePtr ;
}
}
cout << endl ;
}

آؤٹ پٹ

آپ کتنے نوڈس بنانا چاہتے ہیں =>: 6
براہ کرم نوڈ 1 کی معلومات درج کریں (صرف نمبر): 101
براہ کرم نوڈ 2:95 کی معلومات درج کریں۔
براہ کرم نوڈ 3:61 کی معلومات درج کریں۔
براہ کرم نوڈ 4:19 کی معلومات درج کریں۔
براہ کرم نوڈ 5:12 کی معلومات درج کریں۔
براہ کرم نوڈ 6:11 کی معلومات درج کریں۔

منسلک فہرست میں معلومات:
101 95 61 19 12 11

الٹ کے بعد لنک شدہ فہرست
11 12 19 61 95 101

نتیجہ

اس LinuxHint آرٹیکل میں جائزہ لیا گیا ہے کہ C++ میں منسلک فہرست کو کیسے ریورس کیا جائے۔ لنکڈ لسٹ کو ریورس کرنے کے کچھ اور طریقے ہیں، لیکن لنکڈ لسٹ کو ریورس کرنے کا یہ ایک بہت عام طریقہ ہے۔ یہ آپ پر منحصر ہے کہ آپ اپنے مسائل کو کس طرح حل کرنا چاہتے ہیں، لیکن عام طور پر ریورس لنکڈ لسٹ فنکشن پوائنٹر سویپ کے ساتھ ایک سادہ لوپ ہونا چاہیے۔