提示:代码随想录一刷03day
文章目录
前言
添加虚拟头结点方便操作
一、力扣203移除链表元素
1.添加虚拟节点操作
/**
* 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 newHead = new ListNode(-1,head);
ListNode pro = newHead;
ListNode p = head;
while(p!=null){
if(p.val==val){
p = p.next;
pro.next = p;
}else{
pro.next = p;pro = p;
p = p.next;
}
}
return newHead.next;
}
}
2.不添加虚拟节点操作
/**
* 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) {
while(head!=null&&head.val==val){
head = head.next;
}
while(head==null){
return null;
}
ListNode pro = head;
ListNode p = head.next;
while(p!=null){
if(p.val==val){
p = p.next;
pro.next = p;
}else{
pro.next = p; pro = p;
p = p.next;
}
}
return head;
}
}
3.不添加虚拟节点&&不带前置指针
/**
* 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) {
while(head!=null&&head.val==val){
head = head.next;
}
while(head==null){
return null;
}
ListNode p = head;
while(p.next!=null){
if(p.next.val==val){
p.next = p.next.next;
}else{
p = p.next;
}
}
return head;
}
}
二、力扣707设计链表
链表的操作,主要还是在于,附加一个头结点,方便操作
1.单链表
class MyLinkedList {
int size;
ListNode head;
public MyLinkedList() {
this.size = 0;
this.head = new ListNode(0,null);
}
public int get(int index) {
if(index >= this.size || index < 0){
return -1;
}
ListNode p = head;
for(int count = 0; count <= index; count++){
p = p.next;
}
return p.val;
}
public void addAtHead(int val) {
ListNode e = new ListNode(val, null);
e.next = head.next;
head.next = e;
this.size++;
}
public void addAtTail(int val) {
ListNode p = head;
for(int count = 0;count<size; count++){
System.out.println(p.val);
p = p.next;
}
p.next = new ListNode(val, null);
this.size++;
}
public void addAtIndex(int index, int val) {
ListNode p = head;
if(index >= 0 && index <= size){
for(int count = 0;count<index;count++){
p = p.next;
}
ListNode e = new ListNode(val,null);
e.next = p.next;
p.next = e;
this.size++;
}
}
public void deleteAtIndex(int index) {
ListNode p = head;
if(index >= 0 && index < size){
for(int count = 0;count<index;count++){
p = p.next;
}
p.next = p.next.next;
this.size--;
}
}
}
class ListNode{
int val;
ListNode next;
public ListNode(){}
public ListNode(int val, ListNode next){
this.val = val;
this.next = next;
}
}
/**
* Your MyLinkedList object will be instantiated and called as such:
* MyLinkedList obj = new MyLinkedList();
* int param_1 = obj.get(index);
* obj.addAtHead(val);
* obj.addAtTail(val);
* obj.addAtIndex(index,val);
* obj.deleteAtIndex(index);
*/
2.双链表
class MyLinkedList {
int size;
DListNode head, tail;
public MyLinkedList() {
this.size = 0;
this.head = new DListNode(0);
this.tail = new DListNode(0);
this.head.next = this.tail;
this.tail.prev = this.head;
}
public int get(int index) {
if(index >= this.size || index < 0){
return -1;
}
DListNode p = head;
for(int count = 0; count <= index; count++){
p = p.next;
}
return p.val;
}
public void addAtHead(int val) {
this.addAtIndex(0,val);
}
public void addAtTail(int val) {
this.addAtIndex(this.size, val);
}
public void addAtIndex(int index, int val) {
DListNode p = head;
if(index >= 0 && index <= size){
for(int count = 0;count<index;count++){
p = p.next;
}
DListNode e = new DListNode(val);
e.next = p.next;
p.next.prev = e;
e.prev = p;
p.next = e;
this.size++;
}
}
public void deleteAtIndex(int index) {
DListNode p = head;
if(index >= 0 && index < size){
for(int count = 0;count<index;count++){
p = p.next;
}
p.next = p.next.next;
p.next.prev = p;
this.size--;
}
}
}
class DListNode{
int val;
DListNode next, prev;
public DListNode(){}
public DListNode(int val){
this.val = val;
this.next = null;
this.prev = null;
}
}
/**
* Your MyLinkedList object will be instantiated and called as such:
* MyLinkedList obj = new MyLinkedList();
* int param_1 = obj.get(index);
* obj.addAtHead(val);
* obj.addAtTail(val);
* obj.addAtIndex(index,val);
* obj.deleteAtIndex(index);
*/
三、力扣206反转链表
1.头插法反转单链表
/**
* 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 newHead = new ListNode(0,null);
while(head != null){
ListNode p = head;
head = head.next;
p.next = newHead.next;
newHead.next = p;
}
return newHead.next;
}
}
2.双指针法反转单链表
/**
* 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 pre = null;
ListNode cur = head;
ListNode temp = null;
while(cur!=null){
temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;
}
}
2.递归反转单链表
/**
* 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) {
return reverse(null, head);
}
public ListNode reverse(ListNode prev, ListNode cur){
if(cur==null){
return prev;
}
ListNode temp = null;
temp = cur.next;
cur.next = prev;
return reverse(cur, temp);
}
}
总结
加上一个虚拟头结点方便操作
本文介绍了三种不同的方法来实现力扣203题的移除链表元素,包括添加虚拟节点、不添加虚拟节点以及不带前置指针的情况。接着讨论了力扣707题的设计链表,通过单链表和双链表实现基本操作。最后,讲解了力扣206题的反转链表,给出了头插法、双指针法和递归解法。所有方法都关注于如何高效地操作链表节点。
881





