目录
移除链表元素
题目链接:203. 移除链表元素
---给你一个链表的头节点 head
和一个整数 val
,请你删除链表中所有满足 Node.val == val
的节点,并返回 新的头节点 。
思路:关键:若头结点需要删除,可以有两种处理方式:
-直接使用原来的链表进行删除操作
-设置一个虚拟头结点再进行删除操作
class Solution {
public ListNode removeElements(ListNode head, int val) {
//在原来的链表进行删除操作
while(head != null && head.val == val){
head = head.next;
}
ListNode cur = head;
while(cur != null){
//连续出现要删除的元素时,可以直接处理掉
while(cur.next != null && cur.next.val == val)
cur.next = cur.next.next;
cur = cur.next;
}
return head;
}
}
class Solution {
public ListNode removeElements(ListNode head, int val) {
if(head == null)return head;
//设置虚拟头结点再进行删除操作
ListNode dummy = new ListNode(-1,head);
ListNode pre = dummy;//表示当前节点的前一个节点
ListNode cur = head;//表示当前节点
while(cur != null){
//连续出现要删除的元素时,可以直接处理
while(cur != null &&cur.val == val){
pre.next = cur.next;
cur = cur.next;
}
if(cur == null)break;
pre = cur;
cur = cur.next;
}
return dummy.next;
}
}
设计链表
题目链接:707. 设计链表
---单链表中的节点应该具备两个属性:val
和 next
实现 MyLinkedList
类:
-MyLinkedList()
初始化 MyLinkedList
对象。
-int get(int index):获取下标为index的元素值
-void addAtHead(int val):头部插入节点
-void addAtTail(int val):尾部插入节点
-void addAtIndex(int index, int val):在下标为index的结点前插入节点
-void deleteAtIndex(int index):删除下标为index的结点
class MyLinkedList {
//链表长度
int size;
//虚拟头结点
ListNode dummy;
public MyLinkedList() {
int size = 0;
dummy = new ListNode(-1);
}
public int get(int index) {
if(index < 0 || index >= size )return -1;
//找到的index个结点
ListNode cur = dummy;
while(index-- >= 0)
cur = cur.next;
return cur.val;
}
public void addAtHead(int val) {
// ListNode newNode = new ListNode(val);
// //插入操作
// newNode.next = dummy.next;
// dummy.next = newNode;
// size++;
addAtIndex(0,val);
}
public void addAtTail(int val) {
// ListNode newNode = new ListNode(val);
// //找尾部
// ListNode cur = dummy;
// while(cur.next != null)
// cur = cur.next;
// cur.next = newNode;
// size++;
addAtIndex(size,val);
}
public void addAtIndex(int index, int val) {
if(index < 0 || index > size)return;
ListNode newNode = new ListNode(val);
//找到第index-1个结点
ListNode cur = dummy;
while(index-- > 0)
cur = cur.next;
//插入操作
newNode.next = cur.next;
cur.next = newNode;
size++;
}
public void deleteAtIndex(int index) {
if(index < 0 || index >= size)return;
//找到下标值为index-1的结点
ListNode cur = dummy;
while(index-- > 0)
cur = cur.next;
//删除操作
cur.next = cur.next.next;
size--;
}
}
class ListNode{
int val;
ListNode next;
ListNode(){}
ListNode(int val){
this.val = val;
}
}
反转链表
题目链接:206. 反转链表
---给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
思路:首先定义一个cur指针,指向头结点,再定义一个pre指针,初始化为null,还要定义一个next指针用来保存当前节点的后一个节点。
循环时需要先赋值next,然后进行翻转操作,之后移动pre,cur两指针
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null)return head;
ListNode pre = null;//当前节点的前一个节点
ListNode cur = head;//表示当前节点
ListNode next = null;//用来保存当前节点的后一个结点,先定义为空
while(cur != null){
next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return cur;
}
}