203.移除链表元素
头结点可能被移除,所以要加入虚拟头结点。
注意点:最后返回的是dummy.next,不能是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 removeElements(ListNode head, int val) {
if(head==null){
return null;
}
//虚拟头节点
ListNode dummy=new ListNode(-1);
dummy.next=head;
ListNode cur=head;
ListNode pre=dummy;
while(cur!=null&&pre!=null){
if(cur.val!=val){
pre=cur;
cur=cur.next;
}else{
pre.next=cur.next;
cur=cur.next;
}
}
//遇到的问题
return dummy.next;
}
}
707.设计链表
这道题遇到的问题比较多。
需要考虑比较多的边界条件和非法传参。
class MyLinkedList {
int size;
//头节点
ListNode head;
public MyLinkedList() {
size=0;
head=new ListNode(0);
}
/*
*查找第i个节点的值
*/
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) {
addAtIndex(0, val);
}
/*
*在最后面插入
*/
public void addAtTail(int val) {
addAtIndex(size, val);
}
public void addAtIndex(int index, int val) {
if(index>size){
return;
}
//链表长度增加
size++;
ListNode pre=head;
for(int i=0;i<index;i++){
pre=pre.next;
}
ListNode newNode=new ListNode(val);
newNode.next=pre.next;
pre.next=newNode;
}
/*
*按照索引删除节点
*/
public void deleteAtIndex(int index) {
if(index<0||index>=size){
return;
}
ListNode cur=null;
ListNode pre=head;
for(int i=0;i<index;i++){
pre=pre.next;
}
cur=pre.next;
pre.next=cur.next;
size--;
}
}
/**
* 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.反转链表
这道题必须闭着眼睛都会写啦!最好画图
双指针写法。
class Solution {
public ListNode reverseList(ListNode head) {
ListNode pre=null;
ListNode cur=head;
ListNode tmp=null;
while(cur!=null){
//先保存一份cur结点next域里的值(下一个节点的地址)
tmp=cur.next;
//再反转结点,修改当前结点next域里的地址,改变指针的指向
cur.next=pre;
//移动pre和cur指针
pre=cur;
cur=tmp;
}
//返回头结点
return pre;
}
}