数据结构中经典链表问题总结归纳,接上一篇链表问题集锦(一)
单链表逆转
题目描述:给定一个单链表,将其逆转。LeetCode
分析:迭代法求解,借助三个指针start、head、next,start指向逆转后(已重排)的第一个结点,head指向未重排的第一个结点,next指向head的下一个结点,每次将未重排的第一个结点插入到已重排序列的首部。也可利用递归法实现。
将单链表中的某一段逆转
问题描述:将单链表中第m到第n个结点之间的序列逆转。LeetCode
分析:思路和逆转整个链表一样,借助三个指针,pre指向链表中的第 m-1 个元素,begin指向第一个未逆转的元素,then指向begin的下一个元素,即即将插入到pre后面的元素,then = begin->next,依次将begin后面的元素插入到pre后面,并保证所有元素能连接成串。
将单链表进行分组逆转
问题描述:将单链表按顺序分成N组,每组K个元素,最后一组可能少于K个,分别将每组元素逆转,并链接成一个完整的序列。例如一个链表:1->2->3->4->5,如果k=2,则逆转后的序列为2->1->4->3->5;如果k=3,则逆转序列为3->2->1->4->5。LeetCode
分析:分别对每组结点进行逆转,可用迭代法和递归法
将单链表的结点两两交换
题目描述:给定一个单链表,将相邻两个结点两两交换。例如链表:1->2->3->4, 交换后的序列为2->1->4->3。LeetCode
按特定序列将单链表重排
问题描述:Given a singly linked list L: L0→L1→…→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You must do this in-place without altering the nodes’ values.
For example, Given {1,2,3,4}, reorder it to {1,4,2,3}.LeetCode
分析:分三步走:
(1)找到链表的中点位置middle=(len-1)/2
(2)将后半部分(middle之后的元素)链表逆转
(3)同时遍历两部分链表元素,依次将后半部分元素插入到前半部分的相应位置
合并两个有序链表
问题描述:将两个有序链表合并成一个新的有序链表。LeetCode
合并K个有序链表
问题描述:LeetCode