1、两两交换链表中的节点(24)
题目描述:
【中等题】
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
题目链接
思路分析:
题解一:迭代法
1、创建哑结点 dummyhead,令 dummyhead.next = head。令 p指针 表示当前到达的节点,初始化 p = dummyhead。每次需要交换p 后面的两个节点。
2、如果 temp 的后面没有节点或者只有一个节点,则没有更多的节点需要交换,因此结束交换。否则,获得 p 后面的两个节点 node1 和 node2,通过更新节点的指针关系实现两两交换节点。
3、完成上述操作之后,节点关系即变成 temp -> node2 -> node1。再令 p = node1,对链表中的其余节点进行两两交换,直到全部节点都被两两交换。
4、两两交换链表中的节点之后,新的链表的头节点是 dummyhead.next,返回新的链表的头节点即可。
【python 3 代码实现】
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def swapPairs(self, head: ListNode) -> ListNode:
dummyhead=ListNode(0) # 建立虚拟节点
dummyhead.next=head
p=dummyhead
while p.next and p.next.next:
node1=p.next
node2=node1.next
node3=node2.next
node2.next=node1
node1.next=node3
p.next=node2
p=node1
return dummyhead.next
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( 1 ) O(1) O(1)
题解二:递归法
二刷的时候更新
2、k个一组翻转链表(25)
题目描述:
【困难题】
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
题目链接
思路分析:
3、对链表进行插入排序(147)
题目描述:
【中等题】
对链表进行插入排序。
插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。
每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。
插入排序算法:
1、插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
2、每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
3、重复直到所有输入数据插入完为止。
题目链接
思路分析:
4、排序链表(148)
题目描述:
【中等题】
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
进阶:
你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?
题目链接
思路分析: