链表专题
1.203.移除链表元素
两种方法
方法一:直接使用原来的链表来进行删除操作:只需要将头节点向后移动一位(这种方法需要单独写一段逻辑)
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode cur=head;
while(head!=null&&head.val==val){
head=head.next;
}
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) {
ListNode dummy=new ListNode(-1);
ListNode cur=dummy;
dummy.next=head;
while(cur.next!=null){
if(cur.next.val==val){
cur.next=cur.next.next;
}else{
cur=cur.next;
}
}
return dummy.next;
}
}
707. 设计链表
单链表
class MyLinkedList {
int size;
ListNode head;
public MyLinkedList() {
head=new ListNode(0);
size=0;
}
public int get(int index) {
if(index<0||index>=size){
return -1;
}
ListNode cur=head;
for(int i=0;i<=index;i++){
cur=cur.next;
}
return cur.val;
}
public void addAtHead(int val) {
ListNode newNode=new ListNode(val);
newNode.next=head.next;
head.next=newNode;
size++;
}
public void addAtTail(int val) {
ListNode newNode=new ListNode(val);
ListNode cur=head;
while(cur.next!=null){
cur=cur.next;
}
cur.next=newNode;
size++;
}
public void addAtIndex(int index, int val) {
if(index<0||index>size){
return ;
}
ListNode cur=head;
for(int i=0;i<index;i++){
cur=cur.next;
}
ListNode newNode=new ListNode(val);
newNode.next=cur.next;
cur.next=newNode;
size++;
}
public void deleteAtIndex(int index) {
if(index<0||index>=size){
return ;
}
ListNode cur=head;
for(int i=0;i<index;i++){
cur=cur.next;
}
cur.next=cur.next.next;
size--;
}
}
class ListNode{
int val;
ListNode next;
ListNode(){}
ListNode(int val){
this.val=val;
}
}
双链表
class MyLinkedList {
int size;
ListNode head,tail;
public MyLinkedList() {
int size=0;
this.head=new ListNode(0);
this.tail=new ListNode(0);
head.next=tail;
tail.prev=head;
}
public int get(int index) {
if(index<0 || index>=size){
return -1;
}
ListNode cur=head;
//判断是哪一边遍历时间更短
if(index >= size / 2){
//tail开始
cur = tail;
for(int i=0; i< size-index; i++){
cur = cur.prev;
}
}else{
for(int i=0; i<= index; i++){
cur = cur.next;
}
}
return cur.val;
}
public void addAtHead(int val) {
ListNode newNode=new ListNode(val);
newNode.next=head.next;
head.next.prev=newNode;
head.next=newNode;
newNode.prev=head;
size++;
}
public void addAtTail(int val) {
ListNode newNode=new ListNode(val);
ListNode cur=head;
while(cur.next!=null){
cur=cur.next;
}
cur.next=newNode;
newNode.prev=cur;
size++;
}
public void addAtIndex(int index, int val) {
if(index<0||index>size){
return ;
}
ListNode cur=head;
for(int i=0;i<index;i++){
cur=cur.next;
}
ListNode newNode=new ListNode(val);
newNode.next=cur.next;
cur.next.prev=newNode;
cur.next=newNode;
newNode.prev=cur;
size++;
}
public void deleteAtIndex(int index) {
if(index<0||index>=size){
return ;
}
ListNode cur=head;
for(int i=0;i<index;i++){
cur=cur.next;
}
cur.next.next.prev=cur;
cur.next=cur.next.next;
size--;
}
}
class ListNode{
int val;
ListNode next,prev;
ListNode(){}
ListNode(int val){
this.val=val;
}
}