teetcode Remove Linked List Elements我的笨方法

这是我的方法,感觉比较笨,就是用保存前驱的方法,来连接节点。

    ListNode* removeElements(ListNode* head, int val) {
          ListNode *pre_node=head,*next_node=NULL,*old_pre_node=head;
	      while(pre_node){
		       next_node=pre_node->next;
		       if(pre_node->val==val&&pre_node==head){  //head
		            ListNode *t=head;
			        head=next_node;
			        delete t;
		       }
		       else if(pre_node->val==val&&pre_node!=head){
			         old_pre_node->next=next_node;
			         delete pre_node;
			         pre_node=NULL;
		       }
		       if(pre_node!=NULL){  //if pre_node been deleted,then keep the old_pre_node unchanged
		         	old_pre_node=pre_node;
		       pre_node=next_node;  
	      }
	      return head;
    }

多的不说,来看看leetcode上大神的解法:( 出处

    ListNode* removeElements(ListNode* head, int val) {
        ListNode ** phead = &head;
        
        while (1) {
            while (*phead && (*phead)->val == val)
                *phead = (*phead)->next;
            
            if (*phead) phead = &(*phead)->next;
            else break;
        }
        return head;
    }

递归解法:(出处

    ListNode* removeElements(ListNode* head, int val) {
        if (!head) return 0;
        ListNode * tail = removeElements(head->next, val);
        if (head->val == val) return tail; else {
            head->next = tail;
            return head;
        }
    }



对于顺序存储线性表(数组),我们可以使用双指针法来实现倒置操作: ```python # 假设我们有一个简单的顺序表 List List = [1, 2, 3, 4, 5] def reverse_list(lst): left, right = 0, len(lst) - 1 while left < right: lst[left], lst[right] = lst[right], lst[left] left += 1 right -= 1 return lst reversed_lst = reverse_list(List) print("倒置后的线性表:", reversed_lst) # 删除元素 def remove_element(lst, element): for i in range(len(lst)): if lst[i] == element: del lst[i] print("删除指定元素后的线性表:", lst) # 删除一个元素,例如数字3 remove_element(reversed_lst, 3) ``` 对于链式存储线性表(单链表),我们可以定义节点和链表类来实现: ```python class Node: def __init__(self, data=None): self.data = data self.next = None class LinkedList: def __init__(self): self.head = None # 插入节点 def insert(self, data): new_node = Node(data) if not self.head: self.head = new_node else: current = self.head while current.next: current = current.next current.next = new_node # 打印链表 def print_list(self): elements = [] current = self.head while current: elements.append(current.data) current = current.next print("链表:", elements) # 删除节点 def delete(self, target): if not self.head: return if self.head.data == target: self.head = self.head.next return current = self.head while current.next and current.next.data != target: current = current.next if current.next: current.next = current.next.next # 创建链表并插入元素 linked_list = LinkedList() linked_list.insert(1) linked_list.insert(2) linked_list.insert(3) # 打印链表 linked_list.print_list() # 删除指定元素,例如数字2 linked_list.delete(2) # 再次打印链表 linked_list.print_list() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值