LeetNode打卡第九天,链表题

前言

打卡第九天,两道链表题目
1.给一个单链表的头节点 head ,请你反转链表,并返回反转后的链表。
2.给定一个已排序的链表的头 head ,删除所有重复的元素,使每个元素只出现一次。返回已排序的链表 。


一、题目1

1.python代码

Definition for singly-linked list.
class ListNode(object):
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
class Solution(object):
    def reverseList(self, head):
        """
        :type head: Optional[ListNode]
        :rtype: Optional[ListNode]
        """
        pre = None
        cur = head
        while(cur):
            next2 = cur.next
            cur.next = pre
            pre = cur
            cur = next2
        return pre

这里创建三个类似指针的东西:pre, cur, next2,每次遍历的时候将当前指针cur的next赋值前一个指针pre的地址,将pre指针赋值当前指针cur中的地址,将next2指针中的地址赋值给当前指针cur

1.c++代码


  Definition for singly-linked list.
  struct ListNode {
      int val;
      ListNode *next;
      ListNode() : val(0), next(nullptr) {}
     ListNode(int x) : val(x), next(nullptr) {}
      ListNode(int x, ListNode *next) : val(x), next(next) {}
 };

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode *pre = nullptr;
        ListNode *cur = head;
        while(cur)
        {
            ListNode *next = cur->next;
            cur->next = pre;
            pre = cur;
            cur = next;
        }
        return pre;
    }
};

代码原理同上

二、题目2

1.python代码

代码如下(示例):

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next

class Solution(object):
    def deleteDuplicates(self, head):
        """
        :type head: Optional[ListNode]
        :rtype: Optional[ListNode]
        """
        cur = head
        while(cur and cur.next):
            if cur.val == cur.next.val:
                cur.next = cur.next.next
            else:
                cur = cur.next
        
        return head

这里的原理与上一题类似,这里需要重点注意else,这里的逻辑是比较当前结点和下一个结点的值,如果相同,则当前结点的next指向下下个结点的地址,但是指针仍然停留在当前结点的位置,除非下一个结点的值不同。如果去掉else就会出现一个情况,不论当前结点和下一个结点的值是否相同,指针的位置都会变化,指向下一个结点,这里就会有一个问题,如果输入 1 1 1 1 2, 假如cur指向第一个1的位置,代码会跳过第2个1,此时不会去验证cur的值和下下个结点的值是否相同。就直接将第3个1的结点位置赋值给cur,输出错误的答案。所以需要else来让cur结点停留在原处,直到下一个结点的值不同时,才会将下个结点的地址赋值给cur。

2.c++代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        ListNode *cur = head;
        while(cur and cur->next)
        {
            ListNode *nn = cur->next;
            if(cur->val == nn->val)
            {
                cur->next = nn->next;
            }
            else
            {
                cur = cur->next;
            }
        }
        return head;
        
    }
};

总结

熟习自定义链表的操作,主要是弄清楚指针指向什么地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值