赞
踩
ListNode dummyHead=new ListNode();
dummyHead.next=head;
ListNode cur=head;
while(cur!=null && cur.next!=null){ //为什么判断条件这么写,不清楚
if(cur.next.val==val){
cur.next=cur.next.next;
}
cur=cur.next; //只要不相等才能执行这个语句
}
return dummyHead.next;
这里删除【7,7,7,7】最后剩下【7,7】
class Solution { public ListNode removeElements(ListNode head, int val) { if(head==null){ return head; } 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; } }
看到题目的第一想法
首先对于这种应用类的题目,需要自己设计的题目无从下手。不知道如何使用链表。
看完题解后的想法
自己定义一个链表类
class ListNode{
int val;
ListNode next;
public ListNode(){}
public ListNode(int val){
this.val=val;
}
}
这个要熟悉,其次在提供的类中要定义两个变量,一个是头结点,一个是链表的长度,因为在增删的时候需要修改链表的长度,代码中增加和删除的操作要注意
class ListNode{ int val; ListNode next; public ListNode(){ } public ListNode(int val){ this.val=val; } } class MyLinkedList { int size; ListNode dummyHead; public MyLinkedList() { dummyHead = new ListNode(0); size=0; } public int get(int index) { if(index<0 || index>=size){ //对于index不在合理区间内要首先进行讨论 return -1; } ListNode cur=dummyHead; 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++;//这里当确定可以进行添加操作的时候,要首先进行size++的操作 ListNode cur = dummyHead; ListNode newNode = new ListNode(val); for(int i=0;i<index;i++){ cur=cur.next; } newNode.next = cur.next; cur.next = newNode; } public void deleteAtIndex(int index) { if(index<0 || index>=size){ return; } size--; //确定可以删除的时候,也要先进行size--操作 if(index==0){ dummyHead=dummyHead.next; return; } ListNode cur = dummyHead; for(int i=0;i<index;i++){ cur=cur.next; } cur.next = cur.next.next; } }
class Solution { public ListNode reverseList(ListNode head) { if(head==null){ return head; } ListNode dummyhead = new ListNode(); dummyhead.next=head; ListNode cur=head; while(cur!=null){ ListNode temp = cur.next; cur.next=dummyhead; cur=temp; } return cur.next; } }
class Solution { public ListNode reverseList(ListNode head) { if(head==null){ return head; } ListNode pre = null; ListNode cur = head; while(cur!=null){ ListNode temp = cur.next; cur.next=pre; pre = cur; //这里的顺序不能变,不然已经都修改过cur的值了再赋值给pre是有问题的 cur = temp; } return pre; } }
递归法
这里的递归的方法,起始和双指针的思路是一样的
class Solution {
public ListNode reverseNode(ListNode cur,ListNode pre){
if(cur==null){
return pre;
}
ListNode temp=cur.next;
cur.next=pre;
return reverseNode(temp,cur);//这里的两个指针的变化用了递归函数替代了而已
}
public ListNode reverseList(ListNode head) {
return reverseNode(head,null);
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。