链表倒序算法

问题描述:

给定一个链表,将其倒序排列,例如输入1->2->3->4,输出4->3->2->1。链表结点的定义如下,

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

问题分析:

链表倒序的高效算法时间复杂度为O(n),空间复杂度为O(1)。其基本思想是将后面的结点一个个移动到前方,例如对输入 1->2->3->4 的处理步骤是 (1) 2->1->3->4 (2) 3->2->1->4 (3) 4->3->2->1

C++ 代码:

// 对(prev, next)之间的元素进行倒序排列,双开区间
ListNode *reverseList(ListNode *prev, ListNode *next) {
  ListNode *last = prev->next;
  ListNode *cur = last->next;
  while(cur != next) {
    last->next = cur->next;
    cur->next = prev->next;
    prev->next = cur;
    cur = last->next;
  }

  return prev->next;
}

// 对整个链表进行倒序排列
ListNode *reverseList(ListNode *head) {
  if (head == NULL) return head;
  
  ListNode dummy(0);
  dummy.next = head;
  return reverseList(&dummy, NULL);
}

### 回答1: 答:(1)根据输入次序建立单链表,输出链表的值:按照输入的数字建立单链表,输出链表的值;(2)对链表按值从小到大排序,输出链表的值:对链表进行排序,按照从小到大的顺序输出;(3)删除值相同的结点,输出链表的值:删除链表中值相同的结点,输出剩余结点的值;(4)将链表倒序,输出:将链表中结点的顺序反转,输出倒序后的链表结点值。 ### 回答2: 输入n,再输入n个(0-100)之间的正整数: (1)按输入次序建立单链表,并输出链表的值; 输入n和n个正整数。首先创建一个头节点head,并让一个指针p指向head。然后,根据输入的正整数创建节点,并将节点链接到链表中。循环n次完成链表的创建。最后,遍历链表输出节点的值。 (2)对链表按值从小到大排序,并输出链表的值 创建一个新的指针new_head指向head,然后遍历链表中的节点,按节点的值的大小依次排序。如果节点i的值大于节点i+1的值,则交换节点i和节点i+1的位置,直到链表中的所有节点都排好序。最后,遍历链表输出节点的值。 (3)删除值相同的结点,输出链表的值 遍历链表中的节点,如果节点i的值与节点i+1的值相同,则删除节点i+1,并将节点i的next指针指向节点i+2。直到遍历完整个链表,所有相同值的节点都被删除。最后,遍历链表输出节点的值。 (4)将链表倒序,并输出 创建一个指向链表头节点的指针p,并将链表的连接关系依次反转。首先,将指针p指向当前节点,然后将当前节点的next指向上一个节点,再将上一个节点指针指向当前节点,最后将当前节点指针指向下一个节点。重复这个过程直到遍历完整个链表,完成链表倒序。最后,遍历链表输出节点的值。 ### 回答3: (1)按输入次序建立单链表,并输出链表的值: 首先创建一个空链表,然后按照输入的次序将n个(0-100)之间的正整数逐个插入链表的尾部。最后遍历整个链表,输出链表的值。 (2)对链表按值从小到大排序,并输出链表的值: 可以采用插入排序算法链表进行排序。从链表的第二个元素开始,依次将后面的元素插入到已排序的部分中的正确位置。最后遍历整个链表,输出排序后的链表的值。 (3)删除值相同的节点,输出链表的值: 遍历链表,利用一个集合(如哈希表)来记录已经出现的节点值。当遍历到一个节点时,如果该节点的值已经在集合中存在,则删除该节点,否则将该节点的值添加到集合中。最后遍历整个链表,输出删除重复值后的链表的值。 (4)将链表倒序,并输出: 可以采用三个指针的方法来实现链表倒序。首先将当前节点的后继节点保存到一个临时变量中,然后将当前节点的后继指针指向前一个节点,再将当前节点设为前一个节点,最后将临时变量设为当前节点。重复以上步骤直到链表的最后一个节点。最后遍历整个链表,输出倒序后的链表的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值