代码随想录算法训练营第三天:203.移除链表元素 , 707.设计链表 , 206.反转链表
203.移除链表元素
题目链接:203.移除链表元素
class Solution {
public ListNode removeElements(ListNode head, int val) {
//创建一个虚拟的头节点
if(head == null)return head;
ListNode dummy = new ListNode(-1,head);
ListNode p = head;
ListNode pre = dummy;
while(p != null){
if(p.val == val){
pre.next = p.next;
}
else {
pre = p;
}
p = p.next;
}
return dummy.next;
}
}
总结:1.创建虚拟头节点dummy ,然后进行操作,双指针
2.不创建新的头节点;
public ListNode removeElements(ListNode head, int val) {
//不创建创建一个虚拟的头节点
while(head.val == val && head != null )head = head.next;
ListNode curr = head;
while(curr != null){
if (curr.next != null && curr.next.val == val){
curr.next = curr.next.next;
}
curr = curr.next;
}
return head;
}
707.设计链表
题目链接: 707.设计链表
class LinkNode{
int val;
LinkNode next;
public LinkNode(int val) {
this.val = val;
}
public LinkNode() {
}
}
class MyLinkedList {
int size;
LinkNode head;
public MyLinkedList() {
size = 0;
head = new LinkNode(0);
}
public int get(int index) {
if(index < 0 || index >= size){
return -1;
}
LinkNode cur = head;
for (int i = 0; i <= index; i++) {
cur = cur.next;
}
return cur.val;
}
public void addAtHead(int val) {
addAtIndex(0,val);
}
public void addAtTail(int val) {
addAtIndex(size,val);
}
public void addAtIndex(int index, int val) {
if(index > size)return;
if(index < 0)index = 0;
size++;
LinkNode pre = head;
for (int i = 0; i < index; i++) {
pre = pre.next;
}
LinkNode node = new LinkNode(val);
node.next = pre.next;
pre.next = node;
}
public void deleteAtIndex(int index) {
if(index < 0 || index >= size){
return;
}
size--;
if(index == 0 ){
head = head.next;
return;
}
LinkNode p = head;
for (int i = 0; i < index; i++) {
p = p.next;
}
p.next = p.next.next;
}
}
总结:1.链表的基本操作,删除index和插入到index循环终止条件都是<index,此时指针指向index的前一项
206.反转链表
题目链接:206.反转链表
public ListNode reverseList(ListNode head){
if(head == null || head.next == null)return head;
//空间换时间,建立一个动态数组
List list = new ArrayList();
ListNode p = head;
while(p != null){
list.add(p.val);
p = p.next;
}
p = head;
int i = list.size() - 1;
while(p != null) {
p.val = (int) list.get(i--);
p = p.next;
}
return head;
}
总结:1.空间换时间,使用一个动态数组,反向赋值即可
2.改变指针朝向
class Solution {
public ListNode reverseList(ListNode head){
if(head == null || head.next == null)return head;
//改变指针朝向
ListNode p = head;
ListNode q = head.next;
ListNode t = q;
p.next = null;
while(q != null){
t = q.next;
q.next = p;
p = q;
q = t;
}
head = p;
return head;
}
}