Day3| 203.移除链表元素 |707.设计链表 | 206.反转链表
"做的我肚子疼“
203.移除链表元素
有点不习惯用引用,之前还是用c++做出这道题
//使用dummyHead
class Solution {
public ListNode removeElements(ListNode head, int val) {
if(head==null){
return head;
}
ListNode dummyHead = new ListNode(-1,head);
ListNode cur = head;
ListNode pre = dummyHead;
while(cur!=null){
if(cur.val==val){
pre.next = cur.next;
}//如果是的话,pre就不需要去动了
else{
pre = cur;
}
cur = cur.next;
}
//return head;因为head可能被删除了
return dummyHead.next;
}
}
/**
* 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) {
//不用dummyHead
//我们就需要在链表中重新找到我们需要的head
//条件:
//head.val= val
while(head!=null&&head.val==val){
head = head.next;
}//这个是连前后顺序都不能改变的
//出来之后结果就是
//1.head==null
//2.head 是一个正常的头节点
//所以下边出现两种情况的代码
if(head==null){
return head;
}
//通过前两步的过滤措施,我们可以知道head不为空
ListNode cur = head.next;
ListNode pre = head;
while(cur!=null){
if(cur.val == val){
pre.next = cur.next;
}
else{
pre = cur;
}
cur = cur.next;
}
return head;
}
}
707.设计链表
//这道题我是直接抄代码,不然真不会,宝子们!
抄了一遍,再自己写了一遍,画图关键是
//先定义一个类我也是看答案才晓得,哈哈哈哈哈
//不用指针,用引用我是真的有一丢丢不习惯,但勉强能接受
//记得刚开始写着个题目前前后后大约也有一个小时
class ListNode{
int val;
ListNode next;
ListNode(){}
ListNode(int val){
this.val = val;
}
}
class MyLinkedList {
//直接抄,宝子们
//size存储链表元素的个数,size也就是链表的长度
int size;
//虚拟头节点
ListNode head;
//初始化链表
public MyLinkedList() {
size = 0;
head = new ListNode(0);
}
//这里我们固定了一个虚拟头结点,所以size比题目中的size是
//要大一的
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 ;
}
if(index<0){
index = 0;
}
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 ;
}
size--;
ListNode pre = head;
for(int i = 0;i<index;i++){
pre = pre.next;
}
pre.next = pre.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);
*/
//重新做了一遍,但还是做了很久
//这么多的方法是相关联的
class ListNode{
int val;
ListNode next;
public ListNode(){}
public ListNode(int val){
this.val = val;
}
}
class MyLinkedList {
//定义一个链表长度size,size就是元素的个数
//但是嘞,这个题目是从0开始的,而刚好我们虚拟头节点要占一个位置
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 cur = head;
for(int i = 0;i<=index;i++){//cur要指向我们的index的
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 ;
}
if(index<0){
index = 0;
}
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--;
}
}
/**
* 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.反转链表
//反转链表
/**
* 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) {
if(head==null){
return head;
}
ListNode pre = null;
ListNode cur = head;
ListNode temp = null;//这个是最恶心的,detail
while(cur!=null){
temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;
}
}
终于完成今天的作业了,第三天终于结束了,做的我肚子疼