Swap Nodes in Pairs

思路:需要构造一个头指针,指向链表。一次比较两个指针,将其翻转,临界条件是pre != null(链表长度为偶数) && pre.next != null(链表长度为奇数),然后更新头指针和pre

public ListNode swapPairs(ListNode head) {
if(head == null) return null;
ListNode newNode = new ListNode(0);
ListNode node = newNode;
node.next = head;
ListNode ptr = head;
while(ptr != null && ptr.next != null){
node.next = ptr.next;
ptr.next = ptr.next.next;
node.next.next = ptr;
node = node.next.next;
ptr = ptr.next;
}
return newNode.next;
}

Insertion Sort List

思路:构造一个头指针node,指向结果链表。每次取出head和结果链表中的节点val进行比较,知道找到应该插入的位置,插入,然后重置node和head

public ListNode insertionSortList(ListNode head) {
if(head == null) return null;
ListNode node = new ListNode(0);
while(head != null){
ListNode pre = node;
while(pre.next != null && pre.next.val <= head.val){
pre = pre.next;
}
ListNode temp = head.next;
head.next = pre.next;
pre.next = head;
head = temp;
}
return node.next;
}

Odd Even Linked List

思路:依次取出奇数位节点和偶数位节点,然后将奇数尾和偶数头连接起来

public ListNode oddEvenList(ListNode head) {
if(head == null || head.next == null) return head;
ListNode odd = head;
ListNode even = head.next;
ListNode temp = even;
while(even != null && even.next != null){
odd.next = even.next;
odd = odd.next;
even.next = odd.next;
even = even.next;
}
odd.next = temp;
return head;
}

Remove Duplicates from Sorted List II

思路:构造一个头结点指向链表,后面利用双指针判断val是否一致,若不一致则三个指针同时后移,若一直则尾指针后移直到不一致,利用头指针跳过所有重复的节点。

public ListNode deleteDuplicates(ListNode head) {
if(head == null || head.next == null) return head;
ListNode ptr = new ListNode(0);
ptr.next = head;
ListNode copy = ptr;
ListNode pre = head;
ListNode pos = head.next;
while(pos != null){
if(pos.val != pre.val){
ptr = ptr.next;
pre = pre.next;
pos = pos.next;
}
else{
while(pos != null && pos.val == pre.val){
pos = pos.next;
}
ptr.next = pos;
if(pos != null){
pre = pos;
pos = pos.next;
}
}
}
//ptr.next = null;
return copy.next;
}

Merge k Sorted Lists

思路:利用归并的思想,依次将链表的列表从中间分开,然后依次合并两个已排好序的链表

public ListNode mergeKLists(ListNode[] lists) {
int len = lists.length;
if(len == 0) return null;
return helper(lists,0,len - 1);
} public ListNode helper(ListNode[] lists,int l,int r){
if(l < r){
int m = l + (r - l) / 2;
return merge(helper(lists,l,m),helper(lists,m + 1,r));
}
return lists[l];
} public ListNode merge(ListNode l1,ListNode l2){
if(l1 == null) return l2;
if(l2 == null) return l1;
if(l1.val < l2.val){
l1.next = merge(l1.next,l2);
return l1;
}
else{
l2.next = merge(l1,l2.next);
return l2;
}
}

类似的:Sort List,也是归并的思想

Reverse Nodes in k-Group

思路:构造一个头指针指向链表,依次往后当长度等于k时,则翻转链表,这个过程注意需要保存要翻转链表的头结点

public ListNode reverseKGroup(ListNode head, int k) {
ListNode ptr = new ListNode(0);
ptr.next = head;
ListNode ptr1 = ptr;
ListNode curNode = head;
int cnt = 0;
while(curNode != null){
ListNode left = head;
cnt++;
if(cnt == k){
ListNode tail = curNode.next;
curNode.next = null;
ListNode leftCopy = left;
reverse(ptr1,left,curNode);
leftCopy.next = tail;
curNode = tail;
head = curNode;
ptr1 = leftCopy;
cnt = 0;
continue;
}
curNode = curNode.next;
}
return ptr.next;
} public void reverse(ListNode ptr1,ListNode left,ListNode right){
ListNode p = null;
ListNode q = left;
while(left != right){
left = left.next;
q.next = p;
p = q;
q = left;
}
left.next = p;
ptr1.next = left;
}

141 双指针,一个快,一个慢,若过程中两指针相同则有环

19/61 双指针,相隔n

21 递归

160 得到两个链表的长度,重置长链表起点使之和短链表一致直到同时达到连接点

83/203 双指针

206 翻转指针

92 找到要翻转指针的范围,翻转

2/445 首先判断两链表长度,将长的那个作为被加数,即最终一定是加数先置为null,然后一位位相加,注意进位,然后判断是否多余的位上val都是9的情况,最后判断是否需要增加尾指针的情况;445比2多了一个翻转操作

86 构造两个头结点,分别表示不小于x的链表和小于x的链表,依次构造完以后拼接起来

常用的小模块和方法:

  1. 翻转链表
  2. 快慢指针得到链表中点
  3. 构造一个节点指向头结点

练习:

Palindrome Linked List:找到中点、翻转指针、依次比较

Delete Node in a Linked List:只能从要删除节点入手,则依次用后节点的val覆盖前节点的val

Reorder List:找到中点、翻转指针、依次连接

Linked List Cycle II:快慢指针找到相遇的位置,然后一个从head位置走,一个从相遇位置走,在环节点处相遇(注意没环的情况)

Convert Sorted List to Binary Search Tree:快慢指针找中点即头结点,递归建树

链表需注意:判头判尾是否为空、写到.next .val判断当前指针是否为空

LeetCode----Linked List的更多相关文章

  1. LeetCode Linked List Cycle II 和I 通用算法和优化算法

    Linked List Cycle II Given a linked list, return the node where the cycle begins. If there is no cyc ...

  2. LeetCode & linked list bug

    LeetCode & linked list bug add-two-numbers shit test /** * Definition for singly-linked list. * ...

  3. [LeetCode] Linked List Random Node 链表随机节点

    Given a singly linked list, return a random node's value from the linked list. Each node must have t ...

  4. [LeetCode] Linked List Cycle II 单链表中的环之二

    Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Foll ...

  5. [LeetCode] Linked List Cycle 单链表中的环

    Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using ex ...

  6. [LeetCode]Linked List Cycle II解法学习

    问题描述如下: Given a linked list, return the node where the cycle begins. If there is no cycle, return nu ...

  7. LeetCode——Linked List Cycle

    Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using ex ...

  8. LeetCode——Linked List Cycle II

    Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Foll ...

  9. [LeetCode] Linked List Components 链表组件

    We are given head, the head node of a linked list containing unique integer values. We are also give ...

  10. [算法][LeetCode]Linked List Cycle & Linked List Cycle II——单链表中的环

    题目要求 Linked List Cycle Given a linked list, determine if it has a cycle in it. Follow up: Can you so ...

随机推荐

  1. [zz]求一维序列的信息熵(香浓熵)的matlab程序实例

    对于一个二维信号,比如灰度图像,灰度值的范围是0-255,因此只要根据像素灰度值(0-255)出现的概率,就可以计算出信息熵.    但是,对于一个一维信号,比如说心电信号,数据值的范围并不是确定的, ...

  2. SQL联合查询(内联、左联、右联、全联)的语法

    联合查询效率较高,举例子来说明联合查询:内联inner join .左联left outer join .右联right outer join .全联full outer join 的好处及用法. 联 ...

  3. 自定义属性的时候,尽量不要使用value这个命名

    最近我在重写select下拉组件时,使用ul->li来模拟select中的一个个option,并给li添加索引,取名为value. 非IE浏览器下value值工作正常,但是IE下value值工作 ...

  4. SqlServer类库(自定义)

    1,引用System.Configuration; 2,新建应用程序配置文件 读取SqlDataReader中的数据用where (read.Read()){//DoSomeThings()}

  5. NPOI 单元格(cell) 格式参数

    NPOI 单元格(cell) 将格式设为文本 在网上找了很久,都没有关于如何设置的信息,没办法查了下NPOI的源码终于找到了方法.这里共享下,就是“@”参数 ICellStyle cellStyle ...

  6. 一口气从CSS讲到Servlet再到JSP、Struts2,清蒸JavaWeb的前前后后。

    B/S系统就是Browser/Server,浏览器/服务器系统,即,客户在浏览器操作,而代码实现的具体处理以及数据库操作等,则由后台服务器来完成,男耕女织,相得甚欢.比如我们查询成绩,我们通过浏览器输 ...

  7. Linux Shell shortcut

    Ctrl+a跳到第一个字符前Ctrl+x同上但再按一次会从新回到原位置 Details see below: Linux shell shortcut

  8. js继承相关

    这几天看到一篇文章详解Javascript的继承实现,发现js还是很深奥的,比如call.apply.prototype这些,问起来我也能说的头头是道的,但是看到一些复杂的代码有的时候还是会迷糊,所以 ...

  9. iredmail安装脚本分析(三)---conf/global DISTRO值的来源及操作系统的判断

    作者在引入conf/global 文件时,就已经对操作系统的类型进行判断,同时也对DISTRO进行了赋值. 部分代码,如图: 显然文件里的KERNEL_NAME的值就是判断完成的操作系统,具体分析该值 ...

  10. apache安全配置---禁止访问特定文件,防止日志、压缩包被下载

    指定禁止访问 某些后缀的文件 修改apache配置httpd.conf,在最后加上配置后,重启apache <Files ~ ".txt|.log|.zip|.gz|.sql" ...