Daftar terbalik menggunakan rekursi python

Kami telah membahas solusi berulang untuk membalikkan daftar tertaut di posting sebelumnya. Dalam posting ini, kita akan membahas implementasi rekursifnya

Berikut ini adalah implementasi rekursif sederhana yang bekerja dengan memperbaiki .next pointer dari node daftar dan akhirnya pointer kepala. Mungkin bagian tersulit adalah menerima konsep bahwa reverse(&rest, head) memang membalikkan sisanya. Lalu, ada trik untuk mendapatkan satu simpul depan di akhir daftar. Kami merekomendasikan membuat gambar untuk melihat cara kerja triknya

C


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

#include

#include

 

// Node Daftar Tertaut

struct Node

{

    int data;

    struct Node* berikutnya;

};

 

// Fungsi pembantu untuk mencetak daftar tertaut yang diberikan

void printList(struct Node* head)

{

    struct Node* ptr = head;

    sementara (ptr)

    {

        printf("%d —> ", ptr->data);

        ptr = ptr->next;

    }

 

    printf("NULL\n")<;

}

 

// Fungsi Helper untuk menyisipkan node baru di awal linked list

void push(struct Node** head, int data)

{

    struct Node* Node baru = (struct Node*)malloc(sizeof(struct Node));

    Node baru->data = data;

    Node baru->berikutnya = *head;

 

    *head = newNode;

}

 

// Fungsi rekursif untuk membalikkan daftar tertaut yang diberikan. Ini membalikkan

// diberikan daftar tertaut dengan memperbaiki penunjuk kepala dan kemudian `. selanjutnya`

// pointer dari setiap node dalam urutan terbalik

void recursiveReverse(struct Node* head, struct Node** headRef)

{

    struct Node* pertama;

    struct Node* istirahat;

 

    // kasus dasar daftar kosong

    jika (kepala == NULL) {

        kembalikan;

    }

 

    pertama = kepala;           // suppose first = {1, 2, 3}

    istirahat = pertama->next;     // rest = {2, 3}

 

    // kasus dasar. daftar hanya memiliki satu node

    jika (istirahat == NULL)

    {

        // perbaiki penunjuk kepala di sini

        *headRef = pertama;

        kembalikan;

    }

 

    // secara rekursif membalik kasus {2, 3} yang lebih kecil

    // setelah. istirahat = {3, 2}

    recursiveReverse(istirahat, headRef);

 

    // letakkan item pertama di akhir daftar

    istirahat->berikutnya = first;

    pertama->berikutnya = NULL;     // (tricky step — make a drawing)

}

 

// Balikkan daftar tertaut yang diberikan. Fungsi mengambil pointer

// (referensi) ke penunjuk kepala

void mundur(struct Node** head) {

    recursiveReverse(*head, head);

}

 

int utama(batal)

{

    // tombol masukan

    int kunci[] = { 1, 2, 3, 4, 5, 6 };

    int n = sizeof(keys)/sizeof(keys[0]);

 

    struct Node* head = NULL;

    untuk (int i = n - 1; i >=0; i--) {

        tekan(&kepala, keys[i]);

    }

 

    terbalik(&kepala);

    printList(kepala);

 

    kembalikan 0;

}

Unduh  Jalankan Kode

Keluaran

6 —> 5 —> 4 —> 3 —> 2 —> 1 —> NULL

C++


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

#include

#include

menggunakan namespace std;

 

// Node Daftar Tertaut

struct Node

{

    int data;

    Node* berikutnya;

};

 

// Fungsi pembantu untuk mencetak daftar tertaut yang diberikan

void printList(Node* head)

{

    Node* ptr = head;

    sementara (ptr)

    {

        cout << ptr->data << " —> ";

        ptr = ptr->next;

    }

 

    cout << "nullptr" <<< endl;

}

 

// Fungsi Helper untuk menyisipkan node baru di awal linked list

void push(Node* &headRef, int data)

{

    Node* Node baru = new Node();

    Node baru->data = data;

    Node baru->berikutnya = headRef;

 

    headRef = Node baru;

}

 

// Fungsi rekursif untuk membalikkan daftar tertaut yang diberikan. Ini membalikkan

// diberikan daftar tertaut dengan memperbaiki penunjuk kepala dan kemudian `. selanjutnya`

// pointer dari setiap node dalam urutan terbalik

void recursiveReverse(Node* head, Node* &headRef)

{

    Node* pertama;

    Node* istirahat;

 

    // kasus dasar daftar kosong

    jika (kepala == nullptr) {

        kembalikan;

    }

 

    pertama = kepala;           // suppose first = {1, 2, 3}

    istirahat = pertama->next;     // rest = {2, 3}

 

    // kasus dasar. daftar hanya memiliki satu node

    jika (istirahat == nullptr)

    {

        // perbaiki penunjuk kepala di sini

        headRef = pertama;

        kembalikan;

    }

 

    // secara rekursif membalik kasus {2, 3} yang lebih kecil

    // setelah. istirahat = {3, 2}

    recursiveReverse(istirahat, headRef);

 

    // letakkan item pertama di akhir daftar

    istirahat->berikutnya = first;

    pertama->berikutnya = nullptr;  // (tricky step — make a drawing)

}

 

// Balikkan daftar tertaut yang diberikan. Fungsi mengambil pointer

// (referensi) ke penunjuk kepala

void terbalik(Node* &headRef) {

    recursiveReverse(headRef, headRef);

}

 

int utama()

{

    // tombol masukan

    vektor<int> keys = { 1, 2, 3, 4, 5, 6 };

 

    Node* head = nullptr;

    untuk (int i = keys.ukuran() - 1; i >=0; i--) {

        tekan(kepala, keys[i]);

    }

 

    terbalik(kepala);

    printList(kepala);

 

    kembalikan 0;

}

Unduh  Jalankan Kode

Keluaran

6 —> 5 —> 4 —> 3 —> 2 —> 1 —> nullptr

Jawa


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

// Node Daftar Tertaut

kelas Node

{

    int data;

    Node berikutnya;

 

    Node(int data) {

        ini. data = data;

    }

}

 

kelas Utama

{

    // Fungsi pembantu untuk mencetak daftar tertaut tertentu

    publik statis batal printList(Node head)

    {

        Simpul ptr = kepala;

        sementara (ptr . = null)

         {

            Sistem. keluar. cetak(ptr. data + " —> ");

            ptr = ptr. selanjutnya;

        }

        Sistem. keluar. println("null");

    }

 

    // Fungsi pembantu untuk menyisipkan node baru di awal linked list

    publik statis Node push(Node head, int data)

    {

        Node node = baru Node(data);

        simpul. selanjutnya = kepala;

        kembalikan simpul;

    }

 

    // Fungsi rekursif untuk membalikkan daftar tertaut yang diberikan. Ini membalikkan

    // diberikan daftar tertaut dengan memperbaiki penunjuk kepala lalu `. selanjutnya`

    // pointer setiap node dalam urutan terbalik

    publik statis Node terbalik(Node head, Node headRef)

    {

        Node pertama, istirahat;

 

        // kasus dasar daftar kosong

        jika (kepala == null) {

            return headRef;

        }

 

        pertama = kepala;           // suppose first = {1, 2, 3}

        istirahat = pertama. berikutnya;      // istirahat = {2, 3}

 

        // kasus dasar. daftar hanya memiliki satu node

        jika (istirahat == null)

         {

            // perbaiki penunjuk kepala di sini

            headRef = pertama;

            return headRef;

        }

 

        // membalikkan kasus {2, 3} yang lebih kecil

        // sesudahnya. istirahat = {3, 2}

        headRef = terbalik(rest, headRef);

 

        // letakkan item pertama di akhir daftar

        istirahat. berikutnya = pertama;

        pertama. berikutnya = null;      <// (tricky step — make a drawing)

 

        return headRef;

    }

 

    // Balikkan daftar tertaut tertentu. Fungsi mengambil referensi ke

    // node kepala

    publik statis Node terbalik(Node head) {

        kembali mundur(kepala, head);

    }

 

    publik statis batal utama(String[] args)

    {

        // tombol masukan

        int[] kunci = { 1, 2, 3, 4, 5, 6 };

 

        Node head = null;

        untuk (int i = keys.panjang - 1; i >=0; i--) {

            kepala = tekan(head, keys[i]);

        }

 

        kepala = mundur(head);

        printList(head);

    }

}

Unduh  Jalankan Kode

Keluaran

6 —> 5 —> 4 —> 3 —> 2 —> 1 —> nol

Piton


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

# Node Daftar Tertaut

kelas Node.

    def __init__(diri, data, next=None):

        diri sendiri. data = data

        diri sendiri. berikutnya = berikutnya

 

 

# Fungsi untuk mencetak daftar tertaut yang diberikan

def printList(head):

 

    ptr = kepala

    sementara ptr.

        cetak(ptr. data, end=')

        ptr = ptr. selanjutnya

    cetak('Tidak Ada')

 

 

# Fungsi rekursif untuk membalikkan daftar tertaut yang diberikan. Ini membalikkan

# diberikan daftar tertaut dengan memperbaiki penunjuk kepala dan kemudian `. selanjutnya`

# pointer dari setiap node dalam urutan terbalik

def terbalik(kepala, headRef):

 

    # kasus dasar daftar kosong

    jika kepala adalah Tidak ada:

        return headRef

 

    pertama = kepala                 # suppose first = [1, 2, 3]

    istirahat = pertama. selanjutnya           # istirahat = [2, 3]

 

    # kasus dasar. list hanya memiliki satu node

    jika sisa adalah Tidak ada:

        # perbaiki penunjuk kepala di sini

        headRef = pertama

        return headRef

 

    # secara rekursif membalik kasus {2, 3} yang lebih kecil

    # setelahnya. istirahat = [3, 2]

    headRef = terbalik(rest, headRef)

 

    # letakkan item pertama di akhir daftar

    istirahat. selanjutnya = pertama

    pertama. selanjutnya = Tidak ada       # (

 

    return headRef

 

 

# Balikkan daftar tertaut yang diberikan

def reverseList(head):

    kembali mundur(kepala, head)

 

 

jika __nama__ == '__main__'.

 

    kepala = Tidak ada

    untuk i di dibalik(range(6)):

        kepala = Simpul(i + 1, head)

 

    head = reverseList(head)

    printList(head)

 

Unduh  Jalankan Kode

Keluaran

6 —> 5 —> 4 —> 3 —> 2 —> 1 —> Tidak ada

Kita juga dapat mengatasi masalah ini dengan hanya mengirimkan referensi ke penunjuk kepala ke fungsi, seperti yang ditunjukkan di bawah ini

C


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

#include

#include

 

// Node Daftar Tertaut

struct Node

{

    int data;

    struct Node* berikutnya;

};

 

// Fungsi pembantu untuk mencetak daftar tertaut yang diberikan

void printList(struct Node* head)

{

    struct Node* ptr = head;

    sementara (ptr)

    {

        printf("%d —> ", ptr->data);

        ptr = ptr->next;

    }

 

    printf("NULL\n")<;

}

 

// Fungsi Helper untuk menyisipkan node baru di awal linked list

void push(struct Node** head, int data)

{

    struct Node* Node baru = (struct Node*)malloc(sizeof(struct Node));

    Node baru->data = data;

    Node baru->berikutnya = *head;

 

    *head = newNode;

}

 

// Fungsi rekursif untuk membalikkan linked list. Ini membalikkan yang diberikan

// daftar tertaut dengan memperbaiki penunjuk kepala dan kemudian `. pointer` berikutnya

// dari setiap node dalam urutan terbalik

void mundur(struct Node** head)

{

    struct Node* pertama;

    struct Node* istirahat;

 

    // kasus dasar daftar kosong

    jika (*kepala == NULL) {

        kembalikan;

    }

 

    pertama = *kepala;                  // suppose first = {1, 2, 3}

    istirahat = pertama->next;             // rest = {2, 3}

 

    // wadah basis istirahat kosong

    jika (istirahat == NULL) {

        kembalikan;

    }

 

    terbalik(&istirahat);                 // recursively reverse the smaller {2, 3} case

                                   // setelah. istirahat = {3, 2}

 

    pertama->berikutnya->next = first;      // put the first item at the end of the list

    pertama->berikutnya = NULL;             // (tricky step — make a drawing)

    *kepala = istirahat;                   // fix the head pointer

}

 

int utama(batal)

{

    // tombol masukan

    int kunci[] = { 1, 2, 3, 4, 5, 6 };

    int n = sizeof(keys)/sizeof(keys[0]);

 

    struct Node* head = NULL;

    untuk (int i = n - 1; i >=0; i--) {

        tekan(&kepala, keys[i]);

    }

 

    terbalik(&kepala);

    printList(kepala);

 

    kembalikan 0;

}

Unduh  Jalankan Kode

Keluaran

6 —> 5 —> 4 —> 3 —> 2 —> 1 —> NULL

C++


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

#include

#include

menggunakan namespace std;

 

// Node Daftar Tertaut

struct Node

{

    int data;

    Node* berikutnya;

};

 

// Fungsi pembantu untuk mencetak daftar tertaut yang diberikan

void printList(Node* head)

{

    Node* ptr = head;

    sementara (ptr)

    {

        cout << ptr->data << " —> ";

        ptr = ptr->next;

    }

 

    cout << "nullptr" <<< endl;

}

 

// Fungsi Helper untuk menyisipkan node baru di awal linked list

void push(Node* &headRef, int data)

{

    Node* Node baru = new Node();

    Node baru->data = data;

    Node baru->berikutnya = headRef;

 

    headRef = Node baru;

}

 

// Fungsi rekursif untuk membalikkan linked list. Ini membalikkan yang diberikan

// daftar tertaut dengan memperbaiki penunjuk kepala dan kemudian `. pointer` berikutnya

// dari setiap node dalam urutan terbalik

// Fungsi mengambil referensi ke penunjuk kepala

void terbalik(Node* &headRef)

{

    Node* pertama;

    Node* istirahat;

 

    // kasus dasar daftar kosong

    jika (headRef == nullptr) {

        kembalikan;

    }

 

    pertama = headRef;        // suppose first = {1, 2, 3}

    istirahat = pertama->next;     // rest = {2, 3}

 

    // wadah basis istirahat kosong

    jika (istirahat == nullptr) {

        kembalikan;

    }

 

    terbalik(istirahat);  // recursively reverse the smaller {2, 3} case

                    // setelah. istirahat = {3, 2}

 

    pertama->berikutnya->next = first;  // put the first item at the end of the list

    pertama->berikutnya = nullptr;      // (tricky step — make a drawing)

    headRef = istirahat;             // fix the head pointer

}

 

int utama()

{

    // tombol masukan

    vektor<int> keys = { 1, 2, 3, 4, 5, 6 };

 

    Node* head = nullptr;

    untuk (int i = keys.ukuran() - 1; i >=0; i--) {

        tekan(kepala, keys[i]);

    }

 

    terbalik(kepala);

    printList(kepala);

 

    kembalikan 0;

}

Unduh  Jalankan Kode

Keluaran

6 —> 5 —> 4 —> 3 —> 2 —> 1 —> nullptr

Jawa


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

// Node Daftar Tertaut

kelas Node

{

    int data;

    Node berikutnya;

 

    Node(int data) {

        ini. data = data;

    }

}

 

kelas Utama

{

    // Fungsi pembantu untuk menyisipkan node baru di awal linked list

    publik statis Node push(Node head, int data)

    {

        Node node = baru Node(data);

        simpul. selanjutnya = kepala;

        kembalikan simpul;

    }

 

    // Fungsi pembantu untuk mencetak daftar tertaut tertentu

    publik statis batal printList(Node head)

    {

        Simpul ptr = kepala;

        sementara (ptr . = null)

         {

            Sistem. keluar. cetak(ptr. data + " —> ");

            ptr = ptr. selanjutnya;

        }

        Sistem. keluar. println("null");

    }

 

 

    // Fungsi rekursif untuk membalik daftar tertaut.

    // Ini membalikkan daftar tertaut yang diberikan dengan memperbaiki penunjuk kepala dan

    // kemudian `. pointer` berikutnya dari setiap node dalam urutan terbalik

    publik statis Node terbalik(Node head)

    {

        Node pertama, istirahat;

 

        // kasus dasar daftar kosong

        jika (kepala == null) {

            kembalikan kepala;

        }

 

        pertama = kepala;               // suppose first = {1, 2, 3}

        istirahat = pertama. selanjutnya;          // istirahat = {2, 3}

 

        // wadah tempat istirahat kosong

        jika (istirahat == null) {

            kembalikan kepala;

        }

 

        istirahat = mundur(rest);       // recursively reverse the smaller {2, 3} case

        // sesudahnya. istirahat = {3, 2}

 

        pertama. selanjutnya. berikutnya = pertama;    <// put the first item at the end of the list

        pertama. selanjutnya = null;          <// (tricky step — make a drawing)

        kepala = istirahat;                // fix the head pointer

 

        kembalikan kepala;

    }

 

    publik statis batal utama(String[] args)

    {

        // tombol masukan

        int[] kunci = { 1, 2, 3, 4, 5, 6 };

 

        Node head = null;

        untuk (int i = keys.panjang - 1; i >=0; i--) {

            kepala = tekan(head, keys[i]);

        }

 

        kepala = mundur(head);

        printList(head);

    }

}

Unduh  Jalankan Kode

Keluaran

6 —> 5 —> 4 —> 3 —> 2 —> 1 —> nol

Piton


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

# Node Daftar Tertaut

kelas Node.

    def __init__(diri, data, next=None):

        diri sendiri. data = data

        diri sendiri. berikutnya = berikutnya

 

 

# Fungsi untuk mencetak daftar tertaut yang diberikan

def printList(head):

 

    ptr = kepala

    sementara ptr.

        cetak(ptr. data, end=')

        ptr = ptr. selanjutnya

 

    cetak('Tidak Ada')

 

 

# Fungsi rekursif untuk membalikkan daftar tertaut

# Ini membalikkan daftar tertaut yang diberikan dengan memperbaiki penunjuk kepala dan

# kemudian `. pointer berikutnya dari setiap node dalam urutan terbalik

def terbalik(kepala):

 

    # kasus dasar daftar kosong

    jika kepala adalah Tidak ada:

        kembalikan kepala

 

    pertama = kepala                 # suppose first = [1, 2, 3]

    istirahat = pertama. selanjutnya           # istirahat = [2, 3]

 

    # kotak basis istirahat kosong

    jika sisa adalah Tidak ada:

        kembalikan kepala

 

    istirahat = mundur(rest)        # recursively reverse the smaller {2, 3} case

    # setelahnya. istirahat = [3, 2]

 

    pertama. selanjutnya. berikutnya = pertama     # put

    pertama. selanjutnya = Tidak ada           # (

    kepala = istirahat                  # fix the head pointer

 

    kembali kepala

 

 

jika __nama__ == '__main__'.

 

    kepala = Tidak ada

    untuk i di dibalik(range(6)):

        kepala = Simpul(i + 1, head)

 

    kepala = mundur(head)

    printList(head)

 

Unduh  Jalankan Kode

Keluaran

6 —> 5 —> 4 —> 3 —> 2 —> 1 —> Tidak ada

Kita dapat menyederhanakan kode di atas dengan meneruskan informasi simpul sebelumnya ke fungsi. Berikut ini adalah implementasi rekursif sederhana di C, C++, Java, dan Python

Bagaimana Anda membalikkan daftar menggunakan rekursi?

Pendekatan rekursif untuk membalik daftar tertaut itu sederhana, hanya saja kita harus membagi daftar tertaut menjadi dua bagian dan saya. e node pertama dan sisa daftar tertaut, lalu panggil rekursi untuk bagian lain dengan mempertahankan koneksi .

Bagaimana cara membalikkan daftar dengan Python?

Dengan Python, fungsi bawaan bernama reverse() digunakan untuk membalikkan daftar . Cara sederhana dan cepat untuk membalikkan daftar ini membutuhkan sedikit memori. Sintaksis. Daftar nama. reverse() Di sini, list_name berarti Anda harus menulis nama daftar, yang harus dibalik.

Bagaimana Anda membalik daftar dengan Python menggunakan for loop?

3) Menggunakan for loop . Buat daftar kosong untuk menyalin elemen terbalik. Pada perulangan for, tambahkan iterator sebagai elemen daftar di awal dengan elemen daftar baru. Jadi dengan cara itu, elemen daftar akan dibalik.