目录
1.Leetcode第328题——奇偶链表
(1)题目描述:
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。
示例 1:
输入: 1->2->3->4->5->NULL
输出: 1->3->5->2->4->NULL
(2)题目解读:
a.首先,当链表节点数小于3时,直接返回头节点即可
b.当节点数大于等于3时,题目已提示使用原地移动法完成
c.考虑奇数个节点和偶数个节点两种情况
(3)代码:
public class Leetcode_T328 {
public ListNode oddEvenList(ListNode head) {
// 当链表少于3个节点时
if(head==null||head.next==null){
return head;
}
// 链表至少有三个节点
ListNode a=head;
ListNode d=head;
ListNode b=head.next;
ListNode c=head.next;
while(b!=null&&b.next!=null){
a.next=b.next;
a=b.next;
b.next=a.next;
b=a.next;
}
a.next=c;
return d;
}
}
2.Leetcode第24题——两两交换节点
(1)题目描述:
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
(2)题目解读:
- 本来一开始拿到这道题,我以为同上面那道题一样,分奇数偶数两种情况两两交换即可,但做着做着发现这样有点行不通,而且很麻烦,于是就去看了下官方解析,官方给出了两种方法,递归法和迭代法,能用递归解还是很简单的,但我还是不太能灵活运用递归,还有待加强
- 递归解的话,终止条件即为链表为空或者只剩一个节点,该方法实则就是实现两两交换节点,
- 所以可以定义新变量newHead,newHead初始为head.next,此时,newHead为新的头节点,head则为头节点的下一个,然后head.next就是后面链表经过两两交换后的新的头节点,所以head.next = swapPairs(newHead.next);最后将newHead,head连接,并返回newHead。
- 递归代码:
ListNode newHead = head.next;
head.next = swapPairs(newHead.next);
newHead.next=head;
return newHead;
(3)代码:
public class Leetcode_T24 {
public ListNode swapPairs(ListNode head) {
// 如果头节点为空或者只有一个节点,直接返回头节点,这也是递归的终止条件
if(head == null || head.next == null){
return head;
}
// 至少有2个节点,用递归解
// newHead是第二个节点,也是新的头节点
ListNode newHead = head.next;
// head变成第二个节点,head的下一个节点是从newHead.next开始两两交换后的新的第一个节点
head.next = swapPairs(newHead.next);
// 将newHead和head连接
newHead.next=head;
// 最后返回newHead
return newHead;
}
}