代码随想录复习 707设计链表 翻转链表,两两交换节点

代码如下 

type Node struct {    //定义一个节点 ,包含一个数据变量一个指针 

      Val int 

      Next *Node

}

type MyLinkedList struct {  //定义一个链表 ,链表里面有一个虚拟头节点,和大小 

     Dummayhead *Node 

     Size int 

}


 

func Constructor() MyLinkedList { //初始化 :创建一个虚拟头结点,指针域为空,数值域为-1 大小为 0  

      dummayhead := &Node{

          Val : -1 ,

          Next : nil ,

      }

      return MyLinkedList{Dummayhead:dummayhead,Size:0}

}


 

func (this *MyLinkedList) Get(index int) int {  //返回索引对应的值,思路;首先判断索引合不合法 

因为链表长度为size,所以链表节点对应的下标是从0 到size-1 ,如果超出这个范围则不合法  

        if index < 0 || index > this.Size-1 {

            return -1

        }

        cur := this.Dummayhead   //开始遍历,定义一个遍历指针指向虚拟头结点 

        for i := 0 ; i <= index  ; i++ {  //一直向后移动直到index处

            cur = cur.Next 

        }                                  //结束循环时,cur指向index节点 

        return cur.Val

}


 

func (this *MyLinkedList) AddAtHead(val int)  {  在头部添加元素 

          var newnode *Node = &Node{  // 先定义一个节点 

              Val : val ,

              Next : nil ,

          }

          newnode.Next = this.Dummayhead.Next   //虚拟头结点的next指针赋值给新创建节点的next指针,目的是让新创建的指针指向原本链表的头节点,那么新创建的节点就会成为新的头结点 

          this.Dummayhead.Next = newnode  //虚拟头节点在指向这个新创建的节点 

          this.Size++  //最后链表长度加1 

}


 

func (this *MyLinkedList) AddAtTail(val int)  {   //在尾部添加一个节点 

             var newnode *Node = &Node{

              Val : val ,

              Next : nil ,

          }

        cur := this.Dummayhead   //定义一个遍历指针  

        for cur.Next != nil {          //只要该节点的下一个节点不为空,则一直向后遍历   

              cur = cur.Next 

        }

        cur.Next = newnode 

        this.Size++ 

}


 

func (this *MyLinkedList) AddAtIndex(index int, val int)  {  //在index处添加一个节点  

              if index > this.Size {                        //判断index是否合法 

                  return

              }else if index == this.Size {  //如果index等于size,则说明需要队尾添加一个元素,所以直接调用队尾添加元素函数 

                  this.AddAtTail(val)

                  return 

              }else if index < 0 {  

                  index = 0 

              }

              cur := this.Dummayhead   //定义一个遍历指针 

              for i := 0 ; i <= index-1 ; i++ { //这时候需要遍历到index前一个节点 

                  cur = cur.Next

              }

              var newnode *Node = &Node {   //定义一个节点 

                  Val : val ,

                  Next : nil ,

              }

              newnode.Next = cur.Next   //cur的next指针赋值给新定义节点的next指针 

              cur.Next = newnode  //在将cur的next指针域指向新的节点 

              this.Size++ 

}


 

func (this *MyLinkedList) DeleteAtIndex(index int)  {

                if index < 0 || index > this.Size - 1 {

                    return 

                }

                 cur := this.Dummayhead 

                 for i := 0 ; i <= index-1 ; i++ {   //遍历到目标节点的前一个节点 

                     cur = cur.Next

                 }

                 cur.Next = cur.Next.Next  //直接将目标节点的下一个节点赋值给当前遍历到的节点的next指针域   

                 this.Size-- 

}

206 翻转链表 

代码如下  思路如下 :设置两个指针 

pre指针最开始指向空,cur指向头结点,然后将cur直接指向pre,在将cur向后移动,这样做之后,所有的节点都会指向自己的前一个节点,那么在前面的节点就会变为在后面的节点  

func reverseList(head *ListNode) *ListNode {

        var pre *ListNode 

        cur := head 

        

        for cur != nil {

        tmp := cur.Next

        cur.Next = pre 

        pre = cur 

        cur = tmp 

        }

        return pre 

        

}

24 两两交换链表中的节点 

代码如下

注: 这题需要画图,我不知道如何用文字清晰的表达  

/**

 * Definition for singly-linked list.

 * type ListNode struct {

 *     Val int

 *     Next *ListNode

 * }

 */

func swapPairs(head *ListNode) *ListNode {

          dummy := &ListNode{

              Next : head ,

          }

          pre := dummy 

          for head != nil && head.Next != nil {

              tmp := head.Next.Next 

              pre.Next = head.Next 

              head.Next.Next = head 

              head.Next = tmp 

              pre = head 

              head = tmp 

          }

          return dummy.Next

}

你可能感兴趣的:(链表,数据结构,算法)