链表的逆置(链表的相关知识)

输入第一行是一个整数n,第二行是n个整数,输出有两行,第一行是按照n个整数输入时的顺序创建的链表,第二行是对第一个链表的逆置。

img

img

img

img

img

img

供参考:

void invertList(NODE *h)
{
    /************Begin**********/
    NODE *pt = NULL, *ph = NULL;
    ph = h->next;
    h->next = NULL;
    while (ph) {
        pt = ph;
        ph = ph->next;
        pt->next = h->next;
        h->next = pt;
    }
    /***********End************/
}

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7687252
  • 这篇博客也不错, 你可以看下将n个数按输入时顺序的逆序排列,用函数实现
  • 除此之外, 这篇博客: 一些零碎代码中的 从键盘输入n,计算2~n中的质数并且输出 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • :#include
    #include"trap.h"
    #include

    using namespace std;
    int main()
    {
    int n;
    cin >> n;
    int count = 0;
    Arraynice(10);
    int i;

    for (i = 2; i < n; i++)
    {//检查i能否被比它小的质数整除
    	bool judge = true;
    	for (int j = 0; j < count; j++)//如果i被nice[j]整除说明i不是质数
    	{
    		if (i % nice[j] == 0)
    		{
    			judge = false;
    			break;
    		}
    	}
    	if (judge)
    	{
    		if (count == nice.getsize())//如果质数表满了将其空间加倍
    			nice.resize(count * 2);
    		nice[count++] = i;
    	}
    }
    for (i = 0; i < count; i++)
    	cout <<setw(8)<< nice[i];
    

    }//个人认为a[0]一开始应该是一个随机数

  • 以下回答由chatgpt基于相关博客总结生成:

    根据提供的参考资料和问题内容,请回答以下问题:

    对链表的逆置有哪些具体要求或者理解上的困惑吗?

    链表的逆置要求将链表中的节点顺序颠倒过来,例如原来链表是1->2->3->4->5,逆置后变成5->4->3->2->1。需要注意的一点是,链表的逆置是在原链表上进行操作,而不是新建一个逆序的链表。对于理解上的困惑,可以出现在如何修改链表节点的指针指向以及如何保证链表的完整性等方面。

    接下来给出具体的解决方案和代码实现来解决问题。

    首先,我们可以创建一个链表的数据结构,其中每个节点包含一个值和一个指向下一个节点的指针。

    struct ListNode {
        int val;
        ListNode* next;
        ListNode(int x) : val(x), next(NULL) {}
    };
    

    然后,我们需要编写一个函数来创建链表,该函数根据输入顺序创建链表,并返回链表的头节点。

    ListNode* createLinkedList(int n) {
        ListNode* head = NULL;
        ListNode* prev = NULL;
        for (int i = 0; i < n; i++) {
            int num;
            cin >> num;
            ListNode* node = new ListNode(num);
            if (head == NULL) {
                head = node;
            } else {
                prev->next = node;
            }
            prev = node;
        }
        return head;
    }
    

    接下来,我们需要编写一个函数来逆置链表。具体的实现思路是使用三个指针prev、current和next,分别指向当前节点的前一个节点、当前节点和当前节点的下一个节点。通过不断改变指针的指向,就能实现链表的逆置。

    ListNode* reverseLinkedList(ListNode* head) {
        ListNode* prev = NULL;
        ListNode* current = head;
        while (current != NULL) {
            ListNode* next = current->next;
            current->next = prev;
            prev = current;
            current = next;
        }
        return prev;
    }
    

    最后,我们可以调用上述函数来解决问题。具体的实现思路是先调用createLinkedList函数创建链表,然后调用reverseLinkedList函数逆置链表,并将逆置后的链表打印出来。首先,我们需要输入一个正整数n,表示链表节点的个数。然后,再输入n个整数,表示链表节点的值。

    int main() {
        int n;
        cin >> n;
        ListNode* head = createLinkedList(n);
    
        // 打印按照输入顺序创建的链表
        ListNode* current = head;
        while (current != NULL) {
            cout << current->val << " ";
            current = current->next;
        }
        cout << endl;
    
        // 逆置链表
        ListNode* reversedHead = reverseLinkedList(head);
    
        // 打印逆置后的链表
        ListNode* reversedCurrent = reversedHead;
        while (reversedCurrent != NULL) {
            cout << reversedCurrent->val << " ";
            reversedCurrent = reversedCurrent->next;
        }
        cout << endl;
    
        return 0;
    }
    

    这样就能够实现链表的逆置,并按照要求输出原链表和逆置后的链表。