第八天题目,涉及的都是些基本的链表操作~不算太难😀
去旅游玩几天👻🕊🕊🕊

反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

1
2
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例 2:

1
2
输入:head = [1,2]
输出:[2,1]

示例 3:

1
2
输入:head = []
输出:[]

解题思路&题解

这题第一时间想到了递归,当操作流程在递归触底前则表示正向递归,触底后计算则表示反向递归。
这里利用了反向递归(触底后操作),得到一个链表尾开头的链表和当前节点,然后将这条链添加当前元素。
此时,node节点表示反转后的链表。
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
func reverseList(head *ListNode) *ListNode {
if head == nil {
return nil
}
if head.Next == nil {
return head
}
node := reverseList(head.Next)
head.Next.Next = head
head.Next = nil
return node
}

删除排序链表中的重复元素

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。
返回同样按升序排列的结果链表。

示例 1:

1
2
输入:head = [1,1,2]
输出:[1,2]

示例 2:

1
2
输入:head = [1,1,2,3,3]
输出:[1,2,3]

解题思路&题解

这题有个大前提按升序排列的链表, 这个链表是排好序的。通过判断当前节点和下一个节点的值是否想等,相等就删除下一个节点。
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func deleteDuplicates(head *ListNode) *ListNode {
if head == nil {
return nil
}
node := head
for node.Next != nil {
if node.Val == node.Next.Val {
node.Next = node.Next.Next
} else {
node = node.Next
}
}
return head
}