/** * 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) { while(head!=null&&head.val==val) { head = head.next; } ListNode cur = head; while(cur!=null) { while(cur.next!=null&&cur.next.val==val) { cur.next = cur.next.next; } cur=cur.next; } return head;
} } |
对链表操作生疏,本身题目不难,有时间可以二刷
class ListNode{//双链表 int val; ListNode next,prev; ListNode(){} ListNode(int val){ this.val = val; } } class MyLinkedList { ListNode head,tail; int size; public MyLinkedList() { this.size=0; this.head = new ListNode(0); this.tail = new ListNode(0); head.next = tail; tail.prev = head; }
public int get(int index) { if(index<0||index>=size) return -1; ListNode curr = head; for(int i=0;i<=index;i++) { curr = curr.next; } return curr.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; size++; index = Math.max(0,index); ListNode curr = head; for(int i=0;i<index;i++) { curr = curr.next; } ListNode newone = new ListNode(val); newone.next = curr.next; curr.next.prev = newone; curr.next = newone; newone.prev = curr; }
public void deleteAtIndex(int index) { if(index<0||index>=size) return; size--; ListNode curr = head; for(int i=0;i<index;i++) { curr = curr.next; } curr.next.next.prev = curr; curr.next = curr.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); */ |
通过这道题,学习了虚拟头结点,以及链表的构造,做了很久,熟练度低,需要二刷。
/** * 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) { ListNode pre = null; ListNode cur = head; ListNode temp = null; while(cur!=null) { temp = cur.next; cur.next = pre; pre = cur; cur = temp; } return pre; } } |
自己的方法空间复杂度很高,这里代码随想录的双指针方法空间复杂度很低,希望自己可以有使用双指针方法的意识,代码随想录还介绍了递归的方法,对于理解递归也很好。