203.移除链表元素
相关题目链接:
力扣 - 移除链表元素
题目重现
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
思路
链表的删除操作如上图所示,我们需要先找到要删除的节点,但是要注意,在操作某一节点时,我们必须要知道它的前一个节点。
也就是说,我们进行遍历,当目前遍历到的节点的下一节点不为空且等于要删除的值时,开始进行删除操作。在删除操作中,我们也要注意其顺序。
代码
/*** 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 removeElements(ListNode head, int val) {ListNode head1=new ListNode(0);head1.next=head;ListNode temp = head1;while(temp.next!=null){if(temp.next.val==val){temp.next=temp.next.next;}else{temp=temp.next;}}return head1.next;}
}
707.设计链表
相关题目链接:
力扣 - 设计链表
题目重现
设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val 和 next。val 是当前节点的值,next 是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。
在链表类中实现这些功能:
get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。
思路
这道题目分为5个小函数,所以我们针对这五个部分分别进行讲解。
get(index),对于获取第index个节点的值很容易。遍历嘛~
addAtHead(val),在链表的第一个元素前添加一个值为val的节点,和后面addAtIndex(index,val)类似所以,我们先写addAtIndex(index,val)。
在第index个节点之前添加节点:
那么,在第index个节点前添加节点的重要任务就是找到第index个节点的前一个节点(这样才能操作第index个节点)。使用的方法依旧是遍历。
在第 index 个节点之前插入一个新节点,例如index为0,那么新插入的节点为链表的新头节点。
如果 index 等于链表的长度,则说明是新插入的节点为链表的尾结点
如果 index 大于链表的长度,则返回空
至于删除某个节点如上一题的图中所示。
代码
class ListNode {int val;ListNode next;ListNode(){}ListNode(int val) {this.val=val;}
}class MyLinkedList {int size;ListNode head;public MyLinkedList() {size = 0;head = new ListNode(0);}public int get(int index) {if (index < 0 || index >= size) {return -1;}ListNode currentNode = head;for (int i = 0; i <= index; i++) {currentNode = currentNode.next;}return currentNode.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++;ListNode pred = head;for (int i = 0; i < index; i++) {pred = pred.next;}ListNode toAdd = new ListNode(val);toAdd.next = pred.next;pred.next = toAdd;}public void deleteAtIndex(int index) {if (index < 0 || index >= size) {return;}size--;if (index == 0) {head = head.next;return;}ListNode pred = head;for (int i = 0; i < index ; i++) {pred = pred.next;}pred.next = pred.next.next;}
}
206.反转链表
相关题目链接:
力扣 - 反转链表
题目重现
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
思路
具体思路如图所示。要注意修改指向前,要有修改节点的前一个节点存在。
代码
/*** 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 curr=head;ListNode prev=null;while(curr!=null){ListNode next=curr.next;curr.next=prev;prev=curr;curr=next;}return prev;}
}
24. 两两交换链表中的节点
相关题目链接:
两两交换链表中的节点
题目重现
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
思路
本题思路如图所示。
代码
/*** 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 swapPairs(ListNode head) {ListNode pHead=new ListNode(-1);pHead.next=head;ListNode cur=pHead;while(cur.next!=null&&cur.next.next!=null){ListNode temp=cur.next;ListNode temp1=cur.next.next.next;cur.next=cur.next.next;cur.next.next=temp;temp.next=temp1;cur=cur.next.next;}return pHead.next;}
}