لیست پیوندی Leetcode Day3 – انجمن DEV

Leetcode No.203 Remove Linked List Elements
با توجه به سر یک لیست پیوندی و یک عدد صحیح val، تمام گره های لیست پیوندی که Node.val == val دارند را حذف کنید و سر جدید را برگردانید.
/**
* 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; }
* }
*/
این یک سوال لیست لینک شده معمولی است اما به دلیل توانایی بد کدنویسی من با مشکلاتی روبرو هستم.
اما من از یه مشکلی رنج میبرم:
- گره قبلی اولیه و گره فعلی
- کار برای هر دو گره سر و گره دیگر
کد خطا 1
while(head!=null){
if(head.val == val){
head = head.next;
}
}
ListNode preNode = head;
ListNode curNode = head;
while(curNode != null){
System.out.println("find");
if(curNode.val == val){
preNode.next = curNode.next;
}else{
preNode = curNode;
}
curNode = curNode.next;
}
return head;
-
while(head!=null)
شرایط اشتباه
کد خطا 2
public ListNode removeElements(ListNode head, int val) {
ListNode preNode = head;
ListNode curNode = head;
while(curNode != null){
if(curNode.val == val){
// head is different from other element because it is an entry of the Linked list
if(curNode == head){
head = head.next;
curNode = head;
preNode = head;
}else{
// if the node is normal node we just do the remove
preNode.next = curNode.next;
}
}else{
preNode = curNode;
}
curNode = curNode.next;
}
return head;
}
با اصلاح مشکل فوق، به کد مناسب دست پیدا می کنیم:
public ListNode removeElements(ListNode head, int val) {
while((head != null) && (head.val == val)){
head = head.next;
}
ListNode preNode = head;
ListNode curNode = head;
while(curNode!=null){
if(curNode.val == val){
preNode.next = curNode.next;
}else{
preNode = curNode;
}
curNode = curNode.next;
}
return head;
}
- مراقب باشید
while((head != null) && (head.val == val))
، من فقط استفاده می کنمwhile(head.val == val)
و یک استثنای اشاره گر تهی ایجاد کنید تا مراقب آن باشید.
Leetcode No.707 Design Linked List
پیاده سازی لیست پیوندی را طراحی کنید. شما می توانید انتخاب کنید که از یک لیست منفرد یا دارای پیوند دوگانه استفاده کنید.
یک گره در یک لیست پیوندی منفرد باید دو ویژگی داشته باشد: val و next. val مقدار گره فعلی است و next یک اشاره گر/ارجاع به گره بعدی است.
اگر میخواهید از فهرست پیوندی مضاعف استفاده کنید، برای نشان دادن گره قبلی در لیست پیوندی، به یک ویژگی prev دیگر نیاز دارید. فرض کنید تمام گرههای موجود در لیست پیوندی دارای 0 ایندکس هستند.
کلاس MyLinkedList را پیاده سازی کنید:
() MyLinkedList شی MyLinkedList را راه اندازی می کند.
int get(int index) مقدار گره ایندکس را در لیست پیوند شده دریافت کنید. اگر شاخص نامعتبر است، -1 را برگردانید.
void addAtHead(int val) قبل از اولین عنصر لیست پیوندی، یک گره از مقدار val اضافه کنید. پس از درج، گره جدید اولین گره از لیست پیوند شده خواهد بود.
void addAtTail(int val) یک گره از ارزش val را به عنوان آخرین عنصر لیست پیوند شده اضافه کنید.
void addAtIndex(int index, int val) یک گره با ارزش val قبل از گره شاخص در لیست پیوند شده اضافه کنید. اگر شاخص برابر با طول لیست پیوند شده باشد، گره به انتهای لیست پیوندی اضافه می شود. اگر شاخص بزرگتر از طول باشد، گره درج نخواهد شد.
void deleteAtIndex(int index) اگر ایندکس معتبر است، گره فهرست را در لیست پیوند داده شده حذف کنید.
برای کد اشتباه کار کنید
class MyLinkedList {
public Node head;
public Node tail;
public int size;
public class Node{
public int val;
public Node next;
public Node(){
}
public Node(int val){
this.val = val;
}
public Node(int val, Node next){
this.val = val;
this.next = next;
}
}
public MyLinkedList() {
size = 0;
head = null;
tail = null;
}
public int get(int index) {
int count = 0;
Node cur = head;
while(cur != null){
if(count == index){
return cur.val;
}
cur = cur.next;
count ++;
}
return -1;
}
public void addAtHead(int val) {
if(head==null){
head = new Node(val);
// if head == null means this list is empty
tail = head;
}
else{
Node temp = head;
head = new Node(val);
head.next = temp;
}
size++;
}
public void addAtTail(int val) {
if(tail==null){
tail = new Node(val);
head = tail;
}
else{
Node temp = tail;
temp.next = new Node(val);
tail = temp.next;
}
size++;
}
public void addAtIndex(int index, int val) {
if(index > size){
return;
}
if(index == 0){
addAtHead(val);
}
if(index == size){
addAtTail(val);
}
else{
int count = 0;
Node pre = head;
Node cur = head;
while(cur != null){
if(count == index){
Node insert = new Node(val);
pre.next = insert;
// important
insert.next = cur;
size++;
return;
}
else{
pre = cur;
cur = cur.next;
count ++;
}
}
}
}
public void deleteAtIndex(int index) {
if(index > size){
return;
}
if(index == 0){
if(head!=null){
head = head.next;
if(head == null){
tail = null;
}
size--;
return;
}
}else{
int count = 0;
Node pre = head;
Node cur = head;
while(cur != null){
if(count == index){
pre.next = cur.next;
if(pre.next == null){
tail = pre;
}
size--;
return;
}
pre = cur;
cur = cur.next;
count++;
}
}
}
}
/**
* 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);
*/
اشکال زدایی…