力扣开始刷链表的题目.
首先接触移除链表元素的题:
题目链接:203. 移除链表元素 - 力扣(LeetCode)
移除链表元素只需要将需要将需要取到删除节点(例如取名为cur)上一节点 (例如取名为pre),将pre.next指向cur.next即完成删除cur的功能。
在实现代码中,因为头节点(headnode)是找不到上一节点的,所以需要单独判断while(head == null)以及while(head != null && head.val == val)。
这里之所以用while循环而不用if判断语句是因为如果头节点及之后还有很多节点的值都满足val就都需要删除操作,而if语句只会判断一次。
在头节点判断条件成立时,令head=head.next,即完成头节点的删除操作。
接下来再进行剩余节点的判断操作。这里注意定义一个临时指针变量cur=head,防止对头节点直接进行操作。cur是找不到上一个节点的,但是cur.next可以,所以我们首先来判断cur以及cur.next是否为空,不为空再判断cur.next.val是否等于目标值,如果相等,则令cur.next = cur.next.next来删除cur.next位置的数据,如果不相等,则进行指针移动操作,cur=cur.next。
上述是普通方法,需要单独考虑头节点问题,后续讲述虚拟头节点方法:
虚拟头节点即先定义一个新linklist的节点对象dummy,然后,将dummy.next = head即完成为该链表添加一个新的头节点操作。然后只需要判断cur以及cur.next是否为空,然后再进行判断是否满足等于val值条件,再进行和上述普通方法一样的条件。
然后是设计链表的题目
题目链接:
一定要注意在链表类中要定义链表节点:
get函数主要思路:首先判断index是否有效,如果无效直接return -1;如果有效定义一个for循环,最大循环数小于等于index,在循环体内用curr=cur.next完成指针的移动,直到移到index(最后一次循环)退出循环后,return cur.val;
addAtHead函数主要思路:定义需要插入val值节点为newnode,令newnode.next=cur.next; cur.next = newnode;
addAtTail函数主要思路:判断当cur.next != null,一直让cur往后移,直到不符合条件退出循环,再让cur.next = newNode;
addAtIndex主要思路:首先判断index是否有效,如果无效直接return ,如果有效定义一个for循环,最大循环数小于index,在循环体内用curr=curr.next完成指针的移动,直到移到index(最后一次循环)退出循环后,令newNode.next = curr.next;curr.next = newNode;完成插入。
delete也是一样的思路。
总体而言,链表的操作主要靠指针的移动,以及某对象next赋值来改变,必要时画链表图。
以上内容来源于代码随想录。