Leetcode Linked List 总结

删除节点

237. Delete Node in a Linked ListAC代码
O(1)时间删除链表节点

19. Remove Nth Node From End of List(简单题,AC代码
删除链表从后向前数的第n个节点

203. Remove Linked List Elements(简单题,AC代码
给定val,删去链表中所有值为val的节点

83. Remove Duplicates from Sorted ListAC代码
删除链表中的重复元素,保留1个
82. Remove Duplicates from Sorted List II(繁琐,AC代码
删除链表中的重复元素,保留0个

按某种规则重排

206. Reverse Linked List迭代解法递归解法
反转链表
92. Reverse Linked List IIAC代码
链表编号从1开始,反转编号从m开始到n的所有节点,只允许遍历一趟链表

24. Swap Nodes in PairsAC代码
链表的节点从1开始编号,将每两个节点交换, L1L2L3L4L2L1L4L3 L 1 → L 2 → L 3 → L 4 → ⋯ ⇒ L 2 → L 1 → L 4 → L 3 → ⋯

61. Rotate ListAC代码
将链表循环右移k

147. Insertion Sort List
对链表实现插入排序(AC代码
附:链表选择排序(AC代码
148. Sort ListAC代码
链表排序,推荐归并排序,可以借用21. Merge Two Sorted Lists的代码

86. Partition ListAC代码
给定x,将链表中小于x的节点放在前半段,大于等于x的节点放在后半段
328. Odd Even Linked ListAC代码
链表的节点从1开始编号,将链表按照先奇数后偶数的顺序重新排列
以上两题思路均为:建立两个新的链表l1l2,在遍历原链表的过程中,l1l2各自收集节点,最终把l1l2拼接起来

143. Reorder ListAC代码
重排链表, L0L1Ln1LnL0LnL1Ln1L2Ln2 L 0 → L 1 → ⋯ → L n − 1 → L n ⇒ L 0 → L n → L 1 → L n − 1 → L 2 → L n − 2

对两个链表进行操作

21. Merge Two Sorted ListsAC代码
合并两个排序链表

160. Intersection of Two Linked ListsAC代码
两个链表的第一个公共节点

2. Add Two NumbersAC代码
把链表看作整数,求两个链表之和,表头为整数的低位
445. Add Two Numbers IIAC代码
把链表看作整数,求两个链表之和,表头为整数的高位

138. Copy List with Random PointerAC代码
复制链表的复制,链表节点多了一个random成员,指向其它节点或为NULL

其它

141. Linked List CycleAC代码
判断链表中是否有环
142. Linked List Cycle IIAC代码
找出链表成环的位置,如果无环,返回NULL

234. Palindrome Linked ListAC代码
判断链表是否是回文的

109. Convert Sorted List to Binary Search TreeAC代码
利用有序的list构造BST

876. Middle of the Linked List
求链表的中间节点,该题的要求是对于len为偶数的情况,返回靠后的那个节点

靠前版本

class Solution {
public:
    ListNode* middleNode(ListNode* head) {
        ListNode* newHead = new ListNode(-1);
        newHead->next = head;

        ListNode* slow = newHead, *fast = newHead;

        // 判断fast是否能往后走2while( fast && fast->next )
        {
            slow = slow->next;
            fast = fast->next->next;
        }

        return slow;
    }
};

靠后版本

class Solution {
public:
    ListNode* middleNode(ListNode* head) {
        ListNode* slow = head, *fast = head;

        // 判断fast是否能往后走2while( fast && fast->next )
        {
            slow = slow->next;
            fast = fast->next->next;
        }

        return slow;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值