数据结构刷题集合—— 链表
Posted Johnny*
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构刷题集合—— 链表相关的知识,希望对你有一定的参考价值。
237. 删除链表中的节点
【题目描述】
【思路】
将当前节点的值修改后一个节点值,然后删除后一个节点。
要注意:这种删除方法不能删除尾结点。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public void deleteNode(ListNode node) {
node.val = node.next.val;
node.next = node.next.next;
}
}
206. 反转链表
【题目描述】
【思路】
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
ListNode cur = head;
ListNode pre = null;
while( cur != null){
//1、暂存下一节点
ListNode tmp = cur.next;
//2、 当前节点next指向前一个节点
cur.next = pre;
//3、当前节点 和前驱节点移动
pre = cur;
cur = tmp;
}
return pre;
}
}
LeetCode 141. 环形链表
【题目描述】
LeetCode 141. 环形链表
【思路】
快慢双指针,起始p和q同指向头结点。之后p走一步,q走两步,p追赶q,若为环则p、q指针循环一周必定相遇,可以得出环长为p走过的步数。如不为环,则q或q.next最后一定为尾结点
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
/*
p追赶q,若为环则,p、q指针循环一周必定相遇
如不为环,则q或q.next最后一定为尾结点
*/
public boolean hasCycle(ListNode head) {
//快慢双指针p每次走一步 q每次走两步
ListNode p = head;
ListNode q = head;
if( q == null || q.next == null || q.next.next == null) return false;
//初始时位置相同 要先走
p = p.next;
q = q.next.next;
//能走到这说明节点长度都是大于2的
//默认为不带环的链表 则终止条件为q == null
while(q != null){
if(q.next == null || q.next.next == null) return false;
if(p == q) return true;
p = p.next;
q = q.next.next;
}
return false;
}
}
以上是关于数据结构刷题集合—— 链表的主要内容,如果未能解决你的问题,请参考以下文章