1.83题 删除排序链表中的重复元素
每次判断当前和下一个节点是否相等,如果相等就连接到下下个~ 思路比较巧吧
2.快排的链表写法
3.反转链表的递归写法
递归的思想! 多写两遍
4.61题 反转链表(把后面的k个放到前面来)
这个题不难,双指针找到要反转的前面一个 和最后一个 就可以了!!
5.两两交换链表 24题
和第六题很像!很经典的写法,三个指针,然后next.next = pre,next!
6.k个一组交换链表
多练一练,多写一写!
7.反转单链表
递归的写法 和非递归的写法! 要熟练
if(head == null || head.next == null){
return head;
}
ListNode pre = null;
ListNode cur = head;
while(cur != null){
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
public ListNode reverseList(ListNode head) {
if(head == null || head.next == null){
return head;
}
ListNode temp = head.next;
ListNode newHead = reverseList(head.next);
temp.next = head;
head.next = null;
return newHead;
}
8.leetcode 143题 链表重排序
找到中点,后半部分逆序,然后再拼接起来,奇数偶数拼接起来
9.反转环形链表?
第一个节点的pre 还有第一个节点位置 两个可以先保留! 等循环回来的时候,找到末尾的节点,然后此时赋值给pre,就可以了! 再头结点的next = pre 就行!
10.分隔链表 86题
两个链表,一个链表放小于x的节点,一个节点放大于x的节点,然后再合并起来
11.奇偶链表 328题
用两个链表,分别保存 奇数节点和偶数节点,然后合并
12.回文链表234题
找到中点,用栈,或者reverse之后判断都可以(reversse前面一半的)
13.147题 对链表进行插入排序
定义两个节点,pre指向head,cur指向head.next,依次去判断前面一个节点是否小于后面一个节点,如果小于 就继续next,知道找到一个点不相等了,就从头开始遍历,找到第一个不相等的点,然后修改指针的顺序即可,cur指向cur的下一个,因为前面已经是有序的了
14.445题 两数相加II
和第二题有点像,先用两个stack去存链表,然后依次去pop! 最后用一个res存储,存储的时候 也用一个stack ! 然后输出就可以了,比较简单
15.1019题 链表中下一个更大的节点
单调栈
16.链表的增删改查
完成~
增加: 判断是否为空节点,是的话头结点赋值给该节点,否则找到最后一个节点,添加即可
删除:删除指定index的节点,先判断index是否符合要求,有可能删除头结点,因此用虚拟节点
改:改指定index的节点,简单
查:简单