美文网首页
go 链表反转

go 链表反转

作者: GoSnail | 来源:发表于2018-10-15 11:51 被阅读0次

注:详细代码到https://github.com/go-snail/arithmetic/tree/master/link下载。

链表操作是数据结构中基本的操作,下面用golang实现一下链表的基本操作,包括增、删、查以及单链表的反转操作。

package link

import (

    "fmt"

    "github.com/pkg/errors"

)

//链表结构

type ListNode struct {

       data    int

       next *ListNode

}

//初始化链表头,下面的所有操作都是基于带头链表

func NewListNode() *ListNode {

    return &ListNode{next: nil}

}

//获取链表的长度

func (l *ListNode)Length()    int {

    len :=0

    for l.next != nil {

        len++

        l = l.next

    }

    return len

}

//插入节点

func (l *ListNode)InsertNode(d int) error {

    newNode :=new(ListNode)

    newNode.data = d

    newNode.next = l.next

    l.next = newNode

    return nil

}

//删除节点

func (l *ListNode)DelNode(d int) {

    if l == nil {

        errors.New("Empty List!")

        return

     }

    for l.next  != nil {

        if l.next.data == d {

            l.next = l.next.next

            //return  此处控制找到相同数据是否全部删除操作

        }

        l = l.next

    }

}

//遍历链表

func (l *ListNode)ListNode() {

        for l.next != nil {

                fmt.Printf(" %d", l.next.data)

                l = l.next

        }

}

//基于位置删除元素

func (pHead *ListNode)DelNodeById(id int) {

        i :=1

       node := pHead.next

        tmp := pHead

        for node != nil {

            if i == id {

                    tmp.next = node.next

            }

            i++

            tmp = node

            node = node.next

        }

        if i < id {

            errors.New("The Len of the list is less!")

        }

}

//获取链表第一个元素

func (l *ListNode)GetFirstNode() *ListNode {

    return l.next

}

//递归单链反转

func ReverseList(pHead, node *ListNode) *ListNode {

    if node.next == nil {

        pHead.next = node

        return node

    }

    n := ReverseList(pHead, node.next)

    if n != nil {

        n.next = node

        node.next = nil

    }

    return node

}

链表反转操作

//遍历单链反转方法

func (pHead *ListNode)ReverseListV2() {

    pReversedHead := pHead

    var pNode = pHead.next

    var pPrev *ListNode

    for pNode != nil {

            pNext := pNode.next

            if pNext == nil {

                pReversedHead.next = pNode

            }

            pNode.next = pPrev

            pPrev = pNode

            pNode = pNext

    }

    return

}

删除链表中倒数第X位置的节点

此外,删除链表倒数第X个节点,尤其对于单向链表来说,每次只能从链表头开始,这里想到一个小技巧(有更好的方法的可以留言哦~~),先计算链表的总长度M,利用删除第N个节点的函数DelNodeById删除第X=M-N+1节点。

func (l *ListNode)DelReverseNode(dint) {

    len := l.Length()

    l.DelNodeById(len-d+1)

}

相关文章

  • go 链表反转

    注:详细代码到https://github.com/go-snail/arithmetic/tree/master...

  • 2022-02-24 025,024 链表反转,链表中的两数相

    链表反转:思路采用栈,而栈可以用slice的思路实现Go版本 链表两数相加:纯粹的反转相加,注意考虑类似于l1=[...

  • Algorithm小白入门 -- 单链表

    单链表递归反转链表k个一组反转链表回文链表 1. 递归反转链表 单链表节点的结构如下: 1.1 递归反转整个单链表...

  • 链表反转

    循环反转链表 递归反转链表

  • 5个链表的常见操作

    链表 链表反转 LeetCode206:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 环路检...

  • JZ-015-反转链表

    反转链表 题目描述 输入一个链表,反转链表后,输出新链表的表头。题目链接: 反转链表[https://www.no...

  • 算法学习(链表相关问题)

    LeetCode 206 反转链表 LeetCode 92 反转链表II (练习) 完成,方法:在反转链表上改 L...

  • 实战高频leetcode题目

    1. 反转链表 : 反转链表是常见简单题目,定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点...

  • 【教3妹学算法】2道链表类题目

    题目1:反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head ...

  • leecode刷题(22)-- 反转链表

    leecode刷题(22)-- 反转链表 反转数组 反转一个单链表。 示例: 进阶:你可以迭代或递归地反转链表。你...

网友评论

      本文标题:go 链表反转

      本文链接:https://www.haomeiwen.com/subject/uxcfzftx.html