*203.移除链表元素
这道题看上去特别简单,我一上来就是个cur遍历然后不就是
但是本题重点是边界的处理,中间部分移除是很简单,头部呢,尾部呢,这个是我没有考虑到的地方
或者也可以使用虚拟头结点
class Solution {
/**
* 移除链表中相同元素
* @param head
* @param val
* @return
*/
public ListNode removeElements(ListNode head, int val) {
ListNode ans=new ListNode(-1);//虚拟头结点
ans.next=head;
ListNode cur=ans;
while (cur.next!=null){
if(cur.next.val==val){
cur.next=cur.next.next;
}else {
cur=cur.next;
}
}
return ans.next;
}
}
当删除一个结点的时候cur是不用后移的,因为此时还是要再判断一下新来的这个cur.next是不是满足要求。做到不重不漏。
707.设计链表
class ListNode{
int val;
ListNode next;
ListNode(int val){
this.val=val;
this.next=null;
}
ListNode(int val,ListNode next){
this.val=val;
this.next=next;
}
}
class MyLinkedList {
ListNode head;//带有虚拟头结点
int size;//长度
public MyLinkedList() {//构造函数
this.size=0;
this.head=new ListNode(0);
}
public int get(int index) {
if(index>=size||index<0){
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) {//在index之前添加val结点
if(index>size){
return;
}
ListNode temp=new ListNode(val);
if(index<0){
index=0;
}
ListNode cur=head;
for (int i = 0; i < index; i++) {
cur=cur.next;
}
temp.next=cur.next;
cur.next=temp;
size++;
}
public void deleteAtIndex(int index) {
if (index < 0 || index >= size) {
return;
}
if (index == 0) {
head = head.next;
size--;
return;
}
ListNode cur = head;
for (int i = 0; i < index; i++) {
cur = cur.next;
}
cur.next = cur.next.next;
size--;
}
public void linktoString(){
ListNode cur=head;
for (int i = 0; i < size-1; i++) {
System.out.print(cur.val+" ");
cur=cur.next;
}
}
}
这一题的index是真的折磨人。以及找结点的前一个还是本人真的要考虑清楚,一个删除结点中i的遍历范围的bug找了好久。
206.反转链表
对链表进行反转,注意指针next只能有一个,将其指向另一个之时,原先的链就断了(在绘制思路的时候,就先断链,再指向其他处)
class Solution {
/**
* 反转单链表
* @param head
* @return
*/
public ListNode reverseList(ListNode head) {
ListNode pre=null;//虚拟头结点
ListNode cur=head;//遍历结点
ListNode temp=null;
while(cur!=null){
temp=cur.next;
cur.next=pre;
pre=cur;
cur=temp;
}
return pre;
}
}