203.移除链表元素
一开始没有把 cur = cur.next;放在else里面,报错
如果不放在else里面,那么就不会重新检查head.next的值,直接跳到head.next.next
public static ListNode RemoveElements(ListNode head, int val)
{
ListNode dummyHead = new ListNode();//定义一个虚拟头节点
dummyHead .next = head;
ListNode cur = dummyHead;
while (cur.next != null)
{
if (cur.next.val == val)
{
cur.next = cur.next.next;
}else{
cur = cur.next;
}
}
return dummyHead.next;//只返回dummyHead会有一个为0的虚拟头节点
}
public class MyLinkedList {
//size存储链表元素的个数
int size;
//虚拟头结点
ListNode head;
public MyLinkedList() {//不会写
size = 0;
head = new ListNode();
}
public int Get(int index)
{
if (index < 0 || index >=size)//一开始用的>,为什么大于等于,忘了下标和元素个数的区别
{
return -1;
}
else
{
ListNode cur = head;
for (int i = 0; i <= index; i++)//寻找下标为index的元素,cur是虚拟头指针,cur.next才是第0个元素,所以可以加上等于
{
cur = cur.next;
}
return cur.val;
}
}
//将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。
public void AddAtHead(int val) {
size++;//增加元素个数
ListNode cur = head;
ListNode newNode = new ListNode(val);
newNode.next=cur.next;
cur.next=newNode;
//另一种写法
//AddAtIndex(0,val);
}
// 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。
public void AddAtTail(int val) {
size++;
ListNode cur = head;
ListNode newNode = new ListNode(val);
while(cur.next!=null){
cur=cur.next;
}
cur.next=newNode;
}
//另一种写法
//AddAtIndex(size,val);为什么是size,因为是新增一个?
public void AddAtIndex(int index, int val) {
//index大于链表长度
if (index < 0 || index > size){
return;
}
else{
size++;
ListNode toAdd = new ListNode(val);//要插入的节点
ListNode cur=head;
for(int i=0;i<index;i++){//找到下标为index的的前一个节点cur
cur=cur.next;
}
toAdd.next=cur.next;
cur.next=toAdd;
}
}
public void DeleteAtIndex(int index) {
ListNode cur=head;
if(index>=0&&index<size){
for(int i=0;i<index;i++){//找到下标为index的的前一个节点cur
cur=cur.next;
}
cur.next=cur.next.next;
size--;
}
}
}
206.反转链表
写不出来,只知道中间的元素指向进行反转,忘了头结点需要指向null
public ListNode ReverseList(ListNode head) {
ListNode pre=null;
//pre.next=cur 不能这样写TAT pre是空
ListNode cur=head;
while(cur!=null){
ListNode temp=cur.next;
cur.next=pre;//指向null
pre=cur;//pre向左移动,最后位于最后一个元素
cur=temp;
}
return pre;
}